02 2017 档案

摘要:splay模板题。 用splay维护序列,令splay的中序遍历为这个序列,则在处理[l,r]时,先将l-1旋转到根,再将r+1旋转到根的右子树,那么根的右子树的左子树就是[l,r]了。 代码: #include<iostream> #include<cstdio> #include<cstring 阅读全文
posted @ 2017-02-28 10:04 gjghfd 阅读(201) 评论(0) 推荐(1)
摘要:莫队模板题。转移时O(1)维护一下总方案数与相同颜色方案数就可以了。 代码: 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<cmath> 6 using nam 阅读全文
posted @ 2017-02-27 12:55 gjghfd 阅读(167) 评论(0) 推荐(1)
摘要:题目大意: 给出一个序列和m个询问,每个询问求[l,r]中权值∈[a,b]的权值的种类数。 由于询问是离线的,考虑莫队。显然可以用修改和查询为O(log2n)的树状数组维护权值种类数,但这种做法的总时间复杂度是O(n*sqrt(n)*log2m),可能会TLE。 注意到总共有O(m)个查询、O(n* 阅读全文
posted @ 2017-02-24 15:06 gjghfd 阅读(208) 评论(0) 推荐(1)
摘要:树状数组打错调了一个小时。。。 对于点(x,y),其它点只会在他的左下、右下、左上、右上四个方向上。我们只需求在左下方向上就可以了,因为其他方向可以通过改变相对位置求得。 考虑cdq分治。先按x坐标排序,然后将区间[l,r]分为[l,mid],[mid+1,r],因为只求左下方向上的点,所以可以去掉 阅读全文
posted @ 2017-02-24 10:24 gjghfd 阅读(171) 评论(0) 推荐(0)
摘要:假设我们可以求出当a[1]..a[i]是局部最小值而其它点不加限制时的方案数,那么显然可以通过容斥求出答案。 那么怎么求当一些点是局部最小值时的方案数呢? 考虑DP。将数字从小到大放。令f[i][j]表示已经放了i个数,局部最小值的点的状态为j时的方案数,可得到方程: f[i][j]=Σf[i-1] 阅读全文
posted @ 2017-02-23 15:44 gjghfd 阅读(175) 评论(0) 推荐(1)
摘要:bzoj2006: 定义一个四元组{x,l,r,w},表示左端点在x,右端点在[l,r]的超级和弦的最大美妙度在将w作为右端点时取到,w可以用前缀和+线段树/ST表求出。 对于每个i,我们将{i,i+L-1,i+R-1,w}放入一个大根堆中,每次取出美妙度最大的一个加到答案中,并将{i,l,w-1, 阅读全文
posted @ 2017-02-23 10:22 gjghfd 阅读(194) 评论(0) 推荐(1)
摘要:建模: 将用户群和中转站看成点。对于用户群i,将其向a[i],b[i]连一条边,将c[i]作为它的权值。对于中转站i,将-p[i]作为它的权值。 然后问题就转化为求图的最大权闭合子图。 图的闭合子图是指一个点集V,满足对于任意i∈V,i的所有出边指向的点∈V。 根据定义可以知道,图的闭合子图是允许超 阅读全文
posted @ 2017-02-21 15:48 gjghfd 阅读(180) 评论(0) 推荐(1)
摘要:题目大意: 给定一棵有根树,每次询问所有颜色为a的节点的子树中颜色为b的节点个数之和。 思路: 考虑将询问按b的出现次数分类。 若b<=sqrt(n),我们可以在每个b节点用一个vector记录它涉及到的询问。 dfs,用桶记录从根节点到这个节点每种颜色的出现次数,就可以更新答案了。 由于总点数为O 阅读全文
posted @ 2017-02-21 10:28 gjghfd 阅读(226) 评论(0) 推荐(1)
摘要:题目大意: 给出一棵树,每条边有权值,求经过少于l条边,权值和少于w的路径总数。 点分治。每次求出所有点到重心的距离,按w排序,然后维护一个树状数组,记录经过的边<=i的点个数。由于可能两个点都在一棵子树中,再容斥一下就好了。 代码: 1 #include<iostream> 2 #include< 阅读全文
posted @ 2017-02-17 13:32 gjghfd 阅读(356) 评论(0) 推荐(1)
摘要:思路与1492相同。 注意点: 1、叉乘时用long long会爆,要用double 2、凸包中可能什么都没有,这时不能更新。 代码: 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 阅读全文
posted @ 2017-02-16 10:06 gjghfd 阅读(251) 评论(0) 推荐(1)
摘要:显然在某一天要么花完所有钱,要么不花钱。 所以首先想到O(n^2)DP: f[i]=max{f[i-1],(f[j]*r[j]*a[i]+f[j]*b[i])/(a[j]*r[j]+b[j])},j<i 其中f[j]*r[j]/(a[j]*r[j]+b[j])是第j天最多能买多少A券,B类似。 假如 阅读全文
posted @ 2017-02-15 14:02 gjghfd 阅读(438) 评论(0) 推荐(2)
摘要:显然只需求LCP(i,j)就可以了。 将s反转,然后插入后缀自动机。由于后缀自动机的link指针构成了一棵后缀树,而字符串又反转过,所以两个结点的LCP就是LCA。 树形DP,求出以每个结点为LCA的个数就可以了。 代码: 1 #include<iostream> 2 #include<cstdio 阅读全文
posted @ 2017-02-14 08:45 gjghfd 阅读(271) 评论(0) 推荐(1)
摘要:题目大意: 对于一个给定长度为N的字符串,求它的第K小子串是什么。 思路: 先对s构造后缀自动机。 令g[x]为x节点代表的字符串个数 当T=0时,g[x]=1 当T=1时,由于link指针将自动机构成了一颗后缀树,所以每个节点的g就是子树中的g之和。 令f[x]为x节点之后有多少种字符串。 f[x 阅读全文
posted @ 2017-02-13 17:40 gjghfd 阅读(173) 评论(0) 推荐(1)
摘要:线性规划裸题。。。 根据题目很容易可以得到线性规划方程(以样例为例): Min(2*x1+5*x2+2*x3) x1+ 0+ 0>=2 x1+x2+ 0>=3 0+x2+x3>=4 x1,x2,x3>=0 再将方程对偶,得到: Max(2*x1+3*x2+4*x3) x1+x2+ 0<=2 0+x2 阅读全文
posted @ 2017-02-02 13:31 gjghfd 阅读(295) 评论(0) 推荐(1)