摘要:
裸的点分治。。 及时把已经确定的询问清掉就能快不少。时间复杂度O(nlogn*p) 1 #include<cstdio> 2 #include<iostream> 3 #include<cstring> 4 #include<algorithm> 5 using namespace std; 6 c 阅读全文
摘要:
直接把所有数的sg值算出来就行了。 1 #include<cstdio> 2 #include<iostream> 3 #include<cstring> 4 #include<algorithm> 5 using namespace std; 6 const int maxn=1002333; 7 阅读全文
摘要:
首先最短路长度不同的人肯定不会冲突。 对于最短路长度相同的人,跑个最大流就行了。。当然只有一个人就不用跑了 看起来会T得很惨。。但dinic在单位网络里是O(m*n^0.5)的... 1 #include<cstdio> 2 #include<iostream> 3 #include<cstring 阅读全文
摘要:
写了线段树合并。。具体合并姿势和可并堆基本一样。。 1 #include<cstdio> 2 #include<iostream> 3 #include<cstring> 4 #include<algorithm> 5 using namespace std; 6 const int maxn=10 阅读全文
摘要:
比较蛋疼的是我们可以先染个底色,再在底色上染别的东西。 由ccz大爷的题解可得。。将目标状态里相同颜色的联通块缩点后,枚举起点,生成树里的最大节点深度就是需要的次数了, 如果最大深度是白色的话记得-1. 1 #include<cstdio> 2 #include<iostream> 3 #inclu 阅读全文
摘要:
问最小割中可能成为割边和一定会成为割边的边有哪些。 膜了半天各路题解。 比较详细的解释: http://blog.csdn.net/horizon_smz/article/details/50889806 1 #include<cstdio> 2 #include<iostream> 3 #incl 阅读全文
摘要:
分块大法。。 1 #include<cstdio> 2 #include<iostream> 3 #include<cstring> 4 #include<algorithm> 5 #include<cmath> 6 using namespace std; 7 const int maxn=100 阅读全文
摘要:
一个节点的儿子是否交换,不会影响到它和兄弟节点间的逆序对数。 所以每次合并线段树的时候算一下交换与不交换的逆序对数,然后选个较小值就行了。 1 #include<cstdio> 2 #include<iostream> 3 #include<cstring> 4 #include<algorithm 阅读全文
摘要:
莫队+分块。。分块修改O(1),查询O(n^0.5) 总复杂度O(n^1.5) 1 #include<cstdio> 2 #include<iostream> 3 #include<cstring> 4 #include<algorithm> 5 #include<cmath> 6 #define 阅读全文
摘要:
结论题。。。一棵树里用到的颜色数不超过logn。。 f[i][j]表示以i为根的子树里,i的颜色是j的方案数。 g[i][j]表示max{f[i][k]},(k!=j 1 #include<cstdio> 2 #include<iostream> 3 #include<cstring> 4 #inc 阅读全文
摘要:
显然每次都取排序后包含最大值的连续的一段数。 f[i]表示对于剩下的最小的i个数,先手最多比后手多多少分。 f[i]=min{a[j+1]-f[j]}...j<i,a升序排序。 1 #include<cstdio> 2 #include<iostream> 3 #include<cstring> 4 阅读全文
摘要:
哈希或者manacher·改。。我写manacher manacher在拓展的时候改一下判断条件就好了。 1 #include<cstdio> 2 #include<iostream> 3 #include<cstring> 4 #include<algorithm> 5 #define ll lo 阅读全文
摘要:
枚举一个点rt作为三个房间的中点。 那三个房间肯定在rt的不同子树内,且深度相同。 f1[i],f2[i],f3[i]分别表示深度为i,取1,2,3个点的方案数。 时间复杂度O(n^2) 1 #include<cstdio> 2 #include<iostream> 3 #include<cstri 阅读全文
摘要:
题面无法直视系列。 中规中矩的线段树题。 涉及的操作有:区间赋值为0,计算区间内1的个数,区间赋值为1,求区间内最大的连续的1的个数。 1 #include<cstdio> 2 #include<iostream> 3 #include<cstring> 4 using namespace std; 阅读全文
摘要:
这题面D人D得好狠啊 求组合数。。模数10007所以lucas一发。。 求一波逆元算较小的组合数。或者暴力跑也可以 1 #include<cstdio> 2 #include<iostream> 3 #include<cstring> 4 #include<algorithm> 5 #define 阅读全文
摘要:
显然每次走过的最小路程,就是按照dfs序走的总路程。 如果没修改的话其实是虚树。。 既然带了修改。。。其实就是维护关键点的dfs序。 用棵平衡树维护一下就好了,涉及到插入、删除、查找前驱后继、查找最大最小值。 算两点间路程还得求lca (所以这题就变成treap全套板子了。。。 1 #include 阅读全文
摘要:
一开始一脸懵逼。。 后来才想到维护一左一右俩指针l和r..表示[l,r]这段内不同种类的数字<=k+1种。 显然最左的、合法的l随着r的增加而不减。 顺便离散化,记一下各个种类数字出现的次数就可以算出答案了。 时间复杂度O(n) 1 #include<cstdio> 2 #include<iostr 阅读全文
摘要:
一个多月没更博客了。。(期间明白了自己有多傻逼。 这种问题大概就倒着做... f[i][j]:表示考虑剩下的硬币i..n,且之前的人取了j个时,先手最多拿到的钱数。aft[i]:表示硬币i..n的总钱数。 f[i][j]=aft[i]-min{ f[k][k-i] },(i<k<=min(n,i+2 阅读全文