09 2014 档案
摘要:建立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...
阅读全文
摘要:1 #include 2 #include 3 using namespace std; 4 int n,ans,v[41],c[41],s[2]; 5 int work(int L,int R)//分治 6 { 7 if(L==R) return v[L]; 8 int res...
阅读全文
摘要:1 #include 2 using namespace std; 3 bool is_prime(int x) 4 { 5 for(int i=2;i*i0;q--)23 {24 ans=0;25 scanf("%d",&n);26 ...
阅读全文
摘要:总时间限制:1000ms内存限制:65536kB描述输入一个布尔表达式,请你输出它的真假值。 比如:( V | V ) & F & ( F | V )V表示true,F表示false,&表示与,|表示或,!表示非。上式的结果是F输入输入包含多行,每行一个布尔表达式,表达式中可以有空格,总长度不超过1...
阅读全文
摘要:块状树。教程见: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 _...
阅读全文
摘要:对于i属于[1,n],i只能成为[1,n]中n/i个数的约数,易证。1 #include2 int n,i;3 long long ans;4 int main()5 {6 scanf("%d",&n);7 for(i=1;i<=n;i++)ans+=(long long)n/i;8...
阅读全文
摘要:暴力,next_permutation函数用于枚举出下一个排列。sscanf函数用于将字符串转化成数字。 1 #include 2 #include 3 #include 4 using namespace std; 5 int n,len,ans; 6 long long x,t; 7 char ...
阅读全文
摘要:考虑暴力更新的情况,设swap的是L,R位置的数。swap之后的逆序对数应该等于:之前的逆序对数+[L+1,R-1]中比 L位置的数 大的数的个数-[L+1,R-1]中比 L位置的数 小的数的个数-[L+1,R-1]中比 R位置的数 大的数的个数+[L+1,R-1]中比 R位置的数 小的数的个数并且...
阅读全文
摘要:分块,每个点统计还有几步弹出该块,以及它弹出块后的下一个节点是哪个点。注意:update某个点的时候,会可能对当前块内 该点及以前的点 产生影响,所以对这部分点进行更新。 1 #include 2 #include 3 using namespace std; 4 int n,m,op,x,y,sz...
阅读全文
摘要:分块,预处理出:①第i块到第j块之间的偶数值的种类数。②在前i块中,每个值出现的次数。(前缀和)(差分)每次询问时,对于不在整块中的元素,进行暴力转移。注意:减少memset的使用,千万不要写100000个memset,否则会TLE,宁愿每次询问之后O(sqrt(n))地一个个减掉那个记录每个值出现...
阅读全文
摘要:就是看是否有一些点,从其他任何点出发都可到达定理:有向无环图中唯一出度为0的点,一定可以由任何点出发均可达。所以缩点,若出度为零的点(强联通分量)唯一,则答案为该强联通分量中点的度数。若不唯一,答案为0,易证。Code(懒得Tarjan,用了两次DFS): 1 #include 2 #include...
阅读全文
摘要:两遍DFS。第一遍统计以每个点为根的子树大小,第二遍更新答案。 1 #include 2 #include 3 using namespace std; 4 int v[2000001],w[2000001],first[2000001],next[2000001],en,sz[1000001]; ...
阅读全文
摘要:要注意一开始将所有为'1'的点入队,然后通过一次BFS去更新所有点的距离,直到无法更新为止。 1 #include 2 #include 3 #include 4 using namespace std; 5 const int dx[]={0,0,-1,1},dy[]={1,-1,0,0}; 6 ...
阅读全文
摘要:暴搜吧,可以哈希一下,但是懒得写哈希了,所以慢得要死。Code: 1 #include 2 #include 3 #include 4 #include 5 using namespace std; 6 const int di[]={0,0,-1,1},dj[]={-1,1,0,0}; 7 str...
阅读全文
摘要:搜索,没什么好说的。要注意读入。Code: 1 #include 2 #include 3 using namespace std; 4 const int num[10][10]= 5 {{0,0,0,0,0,0,0,0,0,0}, 6 {0,1,1,1,2,2,2,3,3,3}, 7 {0,1,...
阅读全文
摘要:对于任何正整数x,其约数的个数记作g(x)。例如g(1)=1、g(6)=4。如果某个正整数x满足:g(x)>g(i) 02000000000∴最多只用用到这么多不同的质因数。搜索即可。加两个剪枝:①从小到大枚举质因数,不要让 顺序不同的 算作不同的方案。②小的因数的指数必然大于大的因数的指数,∵约数...
阅读全文
摘要:dfs+剪枝*4(通过得很勉强):1、只枚举一半的比赛,另一半直接得出。2、处理前缀和,若大于目标得分则剪枝3、前缀和加上若接下来全胜的得分 仍小于 目标得分,则剪枝。4、枚举到每个人的最后一场比赛时直接用 目标得分-前缀和 计算出最后一场的应得分。Code还是很简单的: 1 #include 2 ...
阅读全文
摘要:需要用数组记录编号为i的书的位置,和位置i处的书的编号。Code: 1 #include 2 #include 3 #include 4 using namespace std; 5 using namespace __gnu_cxx; 6 using namespace __gnu_pbds; 7...
阅读全文
摘要:树链剖分模板题。线段树维护每个段中的颜色数、左端点颜色、右端点颜色。pushup: col[rt]=col[rt 2 #include 3 using namespace std; 4 #define lson rt>1; 39 buildtree(lson); 40 buil...
阅读全文
摘要:rope教程:http://blog.csdn.net/iamzky/article/details/38348653Code(bzoj3673): 1 #include 2 #include 3 using namespace std; 4 using namespace __gnu_cxx; 5...
阅读全文
摘要:维护一个字符串,支持以下操作:主要就是 成段插入、成段删除、成段翻转。前两个操作很好通过rope实现。第三个操作也不难,维护两个rope,一个正向,一个反向,翻转时swap一下就行了。rope教程:http://blog.csdn.net/iamzky/article/details/3834865...
阅读全文
摘要:每次来的如果是人,且宠物数不为零,就从宠物中选出一个与其差距最小的,累加答案;若为零,就把他放入另一个集合里。如果是宠物,则同上。各种平衡树都可过,我蛋疼地用了pb_ds。Code: 1 #include 2 #include 3 #include 4 using namespace std; 5 ...
阅读全文
摘要:Manacher算法教程:http://blog.csdn.net/ggggiqnypgjg/article/details/6645824模板题,Code 附带注释: 1 #include 2 #include 3 #include 4 using namespace std; 5 char b[...
阅读全文
摘要:最优比率生成树教程见http://blog.csdn.net/sdj222555/article/details/7490797个人觉得很明白易懂,但他写的代码略囧。模板题,但是必须Prim,不能用Kruscal,因为是完全图Code: 1 #include 2 #include 3 #includ...
阅读全文
摘要:设每个点有x,y两个权值,求一棵生成树,使得sigma(x[i])*sigma(y[i])最小。设每棵生成树为坐标系上的一个点,sigma(x[i])为横坐标,sigma(y[i])为纵坐标。则问题转化为求一个点,使得xy=k最小。即,使过这个点的反比例函数y=k/x最接近坐标轴。Step1:求得分...
阅读全文