
白书
文章平均质量分 77
CoderFly
如果现在不努力,那跟咸鱼有什么区别。
展开
-
O(nlog(n)) LCS 白书 P66例题27 UVa10635
ab两个字符串,将a字符串重新编号为 则b字符串可根据a字符串编号 例如: a={1,7,5,4,8,3,9} b={1,4,3,5,6,2,8,9} a编号为{1,2,3,4,5,6,7} b重新编号为{1,4,6,3,0,0,5,7} (第二个编号为4是因为原来b中的4在a中位置为4) 0表示在a中没有出现过 然后用nlogn复杂度的LIS解决#include <iostre原创 2016-09-19 18:57:02 · 624 阅读 · 0 评论 -
LA4730 UVA1455 线段树+并查集
以y轴建线段树 把坐标*2 初始化各节点 洲,城市 数目为0 并查集维护每一个连通块的 y坐标最大值最小值(x坐标没用)城市数目 合并时 如果是一个洲(城市数大于1) 线段树对应区间减掉该洲城市数 然后将两个洲合并,再在线段树对应区间增加大洲的城市数 (区间城市数不等于子区间城市数之和)#include <bits/stdc++.h>using namespace std;const in原创 2016-11-20 22:14:02 · 377 阅读 · 0 评论 -
LA4108&UVA1232 线段树
大体思路 维护区间最大值最小值,当新建的建筑物高度大于等于区间最大值时更新同时更新答案,小于最小值忽略. (x+1是因为 区间1~5可以看成 2,3,4,5 四个点 只写x 更新会出错 是因为 更新1~10更新一遍10 更新10~15又会更新一遍10事实上只要更新一遍)#include<bits/stdc++.h>using namespace std;const int maxn=1e5+原创 2016-11-20 21:56:47 · 436 阅读 · 0 评论 -
UVA1400&LA3938 线段树
构造线段树每个节点维护三个值 max_pre 满足当前线段最大前缀和的右端点编号 max_suf 满足当前线段最大后缀和的左端点编号 max_sub 用pair维护满足当前线段最大连续和的两个端点编号 维护max_sub 有三种情况 左右端点都在 左子节点 max_sub等于左子节点的max_sub 左右端点都在 右子节点 max_sub等于右子节点的max_sub 左端点在 左子原创 2016-09-30 10:30:41 · 372 阅读 · 0 评论 -
UVA11992 线段树
因为行数最多20行,所以可以每行建造一颗线段树update时 set操作要清除add标记但add操作不需要清楚set标记maintain函数(用于维护节点)先考虑set再考虑addquery操作要综合考虑add和set{优快云:CODE:1909506}原创 2016-10-01 08:40:44 · 538 阅读 · 2 评论 -
LA5902&UVA1513 树状数组
题目大意:将n个物品从上到下编号,放置 每次询问第i个物品上面有几个物品 并且将第i个物品放到最上面。大体思路树状数组的应用将物品重新编号 n~1 c[i]为树状数组的辅助数组,所求前缀和是当前点到底端的距离 每次将取出的物品重新编号 pos[a]=++tot;原创 2016-10-05 00:06:33 · 438 阅读 · 0 评论 -
LA2191&UVA12086树状数组
裸树状数组……不能再裸了……更改值得时候 别忘了该原数组就可以了#include #include#include#include#include#include#include#include#include#include#includeusing namespace std;typedef long long ll;const int maxn=200010原创 2016-10-05 00:12:40 · 325 阅读 · 0 评论 -
UVA11987 并查集
第一、三个操作 直接带权并查集就可以解决关键是第二个第二个问题在于合并两个节点的时候 第一个节点的子节点会跟着合并到第二个节点中 这提示我们 只要1~n都不作为父节点就可以了所以初始化的时候将 每个节点的父亲节点设为 n+i 这样无论怎样合并节点1~n都不可能成为父节点 那么进行第二个操作的时候只要 将p节点合并到q节点父节点下就可以了具体看代码 第一个操作和第二个操作合并原创 2016-10-05 00:27:45 · 358 阅读 · 0 评论 -
UVA12232加权并查集 加点
#include #include #include #include #include #include #include #include #include #define INF 0x3f3f3f3f #define MAXN 20010 #define MAXM 3010 using namespace std; int N,Q,bug,原创 2016-10-05 00:29:12 · 390 阅读 · 0 评论 -
UVA1401&LA3942 Trie+DP
题目大意将给定长度为L的字符串S 用字典中单词分解 单词可重复使用 问有多少分解方案数大体思路dp[i]表示从i开始的字符串(后缀)的分解方案数 dp[i]=∑dp[i+len(x)] x为字符串S[i...L]的前缀 将单词组成Trie 然后在Trie中查找前缀 找到后递推dp[i]即可#include #include#include#include#includ原创 2016-10-05 10:14:15 · 338 阅读 · 0 评论 -
UVA11488 Trie
组织一棵Trie记录每个节点有多少串经过统计最大值#include #include#include#includeusing namespace std;const int maxn=50010*2+10;typedef long long ll;struct Trie{ int ch[maxn][2]; int tot[maxn]; int原创 2016-10-05 20:26:56 · 394 阅读 · 0 评论 -
UVA11732 左儿子右兄弟 Trie
tot[i]记录每个以i为根的树的叶子节点的数目注意插入的时候要插入‘\0’ 为了分辨 前缀和相同的串对于叶子节点 ans+=tot[u]*(tot[u]-1)/2*2*depth;即相同的串两两一对的对数 *(2*深度)对于非叶子节点 统计以其为根节点的串 两两一对的对数 for(int v=head[u];v;v=next[v]){原创 2016-10-05 20:30:09 · 670 阅读 · 0 评论 -
UVa 11235 RMQ
题目说非降序排列 所以把相同的数合并成段 v[i]和cnt[i]表示第i段的数值和出现的次数 num[i]表示第i个数所在的段的编号 left[i]表示第i个数所在段的左端点 right[i]表示第i个数所在段的右端点 查询[st,ed]答案分为三部分 点st到right[st]的距离和ed到left[ed]的距离还有num[st]+1~num[ed]-1之间的cnt最大值(用RMQ求原创 2016-09-29 17:00:13 · 375 阅读 · 0 评论 -
UVA1492 LA5694 线段树扫描线(矩形面积合并)
我们考虑 每个新机器往右放的起始点(1*1的块)那么我们只要求出哪些位置不可以放就可以了,比如说 3*3 的矩阵 新机器长为2 旧机器在2 2 那么 1 1这个点就不可以放新机器(考虑机器往右放的起始点)再考虑右边界,右边界左边m-1个位置也不可以放再考虑往下放的起始点,同理了综上我们只要分别求出 哪些点不可以放 再用所有点减去就可以了其实这就转化成了求矩形面积合并的问题了注意特判m=原创 2016-11-20 22:26:10 · 609 阅读 · 0 评论