随笔分类 - bzoj
摘要:分块,记录每个块内包括左端点的最大连续白段的长度,整个块内的最大连续白段的长度,和包括右端点的最大连续白段的长度。Because 是区间染色,所以要打标记。至于怎样在O(sqrt(n))的时间内找到最左的白色段呢?非常恶心…… 要考虑跨块的白段和块内的白段,并且顺序不能反。(代码中YuDing()函...
阅读全文
摘要:每个房间用一个集合来维护,具体来说,就是给1-n的数每个数一个long long的hash值,往集合S里insert(i),就是S^=HASH[i];erase(i),也是S^=HASH[i]。用map/set维护某个集合是否已经做过实验。分块,对每个块维护一个maxv[i],代表当前该块内的答案值...
阅读全文
摘要:线段树入门题……因为poj原来的代码莫名RE,所以丧病地写了区间修改的分块……其实就是块上打标记,没有上传下传之类。 1 #include 2 #include 3 using namespace std; 4 int n,m,a[100001],l[400],r[400],delta[400],n...
阅读全文
摘要:考虑每次删除pos位置一个数x后,所造成的的影响就是,逆序对的个数少了在1~pos-1中大于x的数的个数加上pos+1~n中小于x的数的个数。那么我们需要的操作就只有查询区间内比某数大(小)的个数。↑,分块经典操作,每个块里维护一个有序表。由于有删除,最好每个块用一个vector。对于原数列怎么办呢...
阅读全文
摘要:分块 或 树套树。在每个块中维护一个有序表,查询时各种二分,全都是分块的经典操作,就不详细说了。块的大小定为sqrt(n*log2(n))比较快。 1 #include 2 #include 3 #include 4 #include 5 using namespace std; 6 i...
阅读全文
摘要:http://www.cnblogs.com/wmrv587/p/3843681.htmlORZ 分块大爷。思路很神奇也很清晰。把 块内最值 和 块内有序 两种良好的性质结合起来,非常棒地解决了这个问题。图中黑色的楼房即为每个块内的“可视序列”,显而易见,在块内它们的K(斜率)是单增的。由于上图中第...
阅读全文
摘要:分块,在每个点记录一下它之前离它最近的相同颜色的位置pre[i],显然问题转化成了求[l,r]中pre[i] 2 #include 3 #include 4 #include 5 using namespace std; 6 int n,m,sz,sum,l[30],r[30],num[10001]...
阅读全文
摘要:不用Matrix-tree定理什么的,一边kruscal一边 对权值相同的边 暴搜即可。将所有方案乘起来。 1 #include 2 #include 3 using namespace std; 4 int n,m; 5 struct Disjoint_Set 6 { 7 int fa[1...
阅读全文
摘要:跟去年NOIP某题基本一样。最小生成树之后,就变成了询问连接两点的路径上的权值最大的边。倍增LCA、链剖什么的随便搞。块状树其实也是很简单的,只不过每个点的点权要记录成“连接其与其父节点的边的权值”,然后暴力LCA时不要用LCA的值更新答案了。 1 #include 2 #include 3 ...
阅读全文
摘要:STL裸题,线下AC,bzoj无限RE ing…… 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 using namespace std; 8 using namespace __gnu_cxx; 9 usin...
阅读全文
摘要:建立k+1张图,在图与图之间,若在原图中x到y有边,就建立从 第i层的x 到 i+1层的y 建边,权值为0。代表一次免费机会。由于一旦到了第i+1层的图里,则无法回到之前的层,所以免费最多只有k次。符合题意。spfa会TLE。 1 #include 2 #include 3 #include 4 #...
阅读全文
摘要:题意:给你一个n*m的点阵、有些点是障碍,求一个欧几里得距离最大的点对(A,B),使得在移走的障碍≤T的情况下,可以从A走到B。建图,跑n*m次spfa,求出从 每个点 出发到 其他所有点 的 经过的障碍数。若这个值 2 #include 3 #include 4 #include 5 #inclu...
阅读全文
摘要:区间k大,分块大法好,每个区间内存储一个有序表。二分答案,统计在区间内小于二分到的答案的值的个数,在每个整块内二分、零散的暴力即可。还是说∵有二分操作,∴每个块的大小定为sqrt(n*log2(n))比较快呢。 1 #include 2 #include 3 #include 4 #include ...
阅读全文
摘要:带 加点 删边的块状树。加点在 bzoj3720 说过。删边其实就是块顶打标记,记录其属于哪棵树,防止在dfs搜集答案时跑到别的树上。然后暴力把所在块拆开。好像用邻接表存图,直接在vector里删边也行? 1 #include 2 #include 3 #include 4 #include...
阅读全文
摘要:块状树。教程见:http://z55250825.blog.163.com/blog/static/1502308092014163413858/将树按一定大小分块,分成许多子树,在每个子树的根节点记录一个数组,存储这个块中数据的有序表,查询时二分即可。对于添加节点操作,若添加的节点的父节点所在块大...
阅读全文
摘要:很早之前用树链剖分写过,但是代码太长太难写,省选现场就写错了。 1 #include 2 #include 3 #include 4 using namespace std; 5 #define lson rt>1,ans=0; 26 if(ql>1,ans=-2147483647...
阅读全文
摘要:暴力枚举。 1 #include 2 #include 3 using namespace std; 4 int n,a[101],sum[101],half,ans; 5 int query(const int &A,const int &B) 6 { 7 int x=max(A,B),y...
阅读全文
摘要:考虑poj3320尺取法的做法,与此题基本一样,但是此题的 位置 的范围到2^31 尺取法不可。将每种珠子所在的位置排序。每种珠子要维护一个指针,指到已经用到这个种类的哪个珠子。所以尺取法用堆优化,每次从堆中取出最小的,相当于尺取法的头指针向后移动。然后从每种珠子里向后取出一个位置(指针++)(已经...
阅读全文
摘要:按完成时限排序,一个个修复。若当前建筑花费时间+之前花费的总时间不超过时限,则ans++;否则,从之前已修复的建筑中挑一个耗时最多的,与当前建筑比较,若当前建筑更优,则更新ans。 1 #include 2 #include 3 #include 4 using namespace std; 5 p...
阅读全文
摘要:用并查集维护联通性。对每个联通块维护一个平衡树。合并时启发式合并。比较懒,用了pb_ds。 1 #include 2 #include 3 #include 4 using namespace std; 5 using namespace __gnu_cxx; 6 using namespace _...
阅读全文

浙公网安备 33010602011771号
