上一页 1 ··· 23 24 25 26 27 28 29 30 31 ··· 38 下一页
摘要: 对于一条路径x-y:·若x与y成祖先-孩子关系,假设y是x的祖先,z是y到x方向的第一个节点,则包含它的路径满足:起点在x的子树里,且终点不在z的子树里。·若x与y不成祖先-孩子关系,则包含它的路径满足:起点在x的子树里,且终点在y的子树里。于是每个盘子可以拆成一个或两个矩形,每个水果可以当成两个点... 阅读全文
posted @ 2015-09-08 20:03 Claris 阅读(890) 评论(0) 推荐(0) 编辑
摘要: 一个点的感染时间为它到根路径上虚边数+1。用Link-Cut Tree模拟虚实边切换,每次切换时等价于在一段或两段DFS序区间更新,线段树维护即可。时间复杂度$O(n\log^2n)$。#includetypedef long long ll;const int N=100010,M=262145;... 阅读全文
posted @ 2015-09-08 16:15 Claris 阅读(640) 评论(0) 推荐(0) 编辑
摘要: 用后缀树统计出出现了x次的本质不同的子串的个数,最后再乘以x,得到一个多项式。这个多项式常数项为0,但是一次项不为0。于是把整个多项式除以一次项,通过多项式求ln和多项式求exp求出它的幂。最后再把除掉的项乘回来即可,时间复杂度$O(n\log n)$。#include#includetypedef... 阅读全文
posted @ 2015-09-08 10:39 Claris 阅读(439) 评论(0) 推荐(0) 编辑
摘要: 对于一条边x->y,若去掉之后x不能到达y,那么它是必需的。首先拓扑排序求出拓扑序,然后按照终点拓扑序为第一关键字,起点拓扑序为第二关键字从小到大加边。对于每个点,维护一个bitset,表示当前从哪些点可以到达自己。时间复杂度$O(\frac{nm}{32})$。#include#include#i... 阅读全文
posted @ 2015-09-07 23:28 Claris 阅读(595) 评论(0) 推荐(0) 编辑
摘要: 树链剖分+线段树。线段树每个区间[l,r]维护:m:最大的负数s:所有数字绝对值的和d:正数的个数-负数的个数t:懒惰标记区间修改时,若最大的负数=0,则暴力递归,否则打标记。因为每个负数只会被暴力修改一次,所以时间复杂度为$O(n\log^2n)$。#include#define N 100010... 阅读全文
posted @ 2015-09-05 00:49 Claris 阅读(376) 评论(1) 推荐(0) 编辑
摘要: 树上带修改莫队算法,对于维护mex值,可以使用修改$O(1)$,查询$O(\sqrt{n})$的权值分块,总时间复杂度为$O(n^\frac{5}{3})$。#include#include#define N 50010#define K 15using namespace std;inline v... 阅读全文
posted @ 2015-09-05 00:04 Claris 阅读(548) 评论(0) 推荐(0) 编辑
摘要: 可以修建的缆车总数不超过n,于是可以先通过$O(n^2)$的枚举求出所有可以修建的缆车。对于一个缆车,若它仅连接i和i+1,那么它不受k的限制,把这种缆车额外取出,从大到小排序。剩下的缆车两两之间要么是包含关系,要么没有任何交集,按照包含关系可以建出一棵树。设f[i][j][k]表示以i为根的子树中... 阅读全文
posted @ 2015-09-04 12:48 Claris 阅读(341) 评论(0) 推荐(0) 编辑
摘要: 答案=回文子序列数目-回文子串数目。回文子串数目可以通过Manacher在$O(n)$时间内求出。对于求回文子序列的数目,设f[i]为以i为对称中心的字符对数,则它对答案的贡献为$2^{f[i]}-1$。对于两个数$1\leq i\leq j\leq n$,若a[i]==a[j],那么它们对f[i+... 阅读全文
posted @ 2015-09-03 19:31 Claris 阅读(345) 评论(0) 推荐(0) 编辑
摘要: 首先旋转坐标系,把每个点可以接收的范围转化成一个正方形。然后建立k-d tree,并记录下每个点在k-d tree上的位置。对询问使用莫队算法,修改$O(\log n)$,查询期望$O(\log n)$。总复杂度$O(n\sqrt{n}\log n)$。#include#include#includ... 阅读全文
posted @ 2015-09-03 15:59 Claris 阅读(313) 评论(0) 推荐(0) 编辑
摘要: 设一种方案里三角形上三个点的坐标分别为$(0,0),(-a,b),(c,d)$,则得到的平行四边形的面积为$ac+bd$。设$d(n)$为$n$的约数个数,$D$为$d$的生成函数,则答案的生成函数$=D^2$。先用线性筛$O(n)$求出$d$,再用FFT在$O(n\log n)$的时间内预处理出所... 阅读全文
posted @ 2015-09-03 00:47 Claris 阅读(588) 评论(0) 推荐(0) 编辑
摘要: 对于一个点,要求出它到所有点的带权距离和,只需记录下树分治的结构然后查询即可。修改$O(\log n)$,查询$O(\log n)$。到所有点带权距离和最小的点显然是这棵树的带权重心。以1号点为根,考虑一条从父亲x到孩子y的边:若y子树内权值和>=总权值和-y子树内权值和,即2*y子树内权值和>=总... 阅读全文
posted @ 2015-09-03 00:03 Claris 阅读(1460) 评论(0) 推荐(1) 编辑
摘要: 显然资源集合处就是树的重心,这题需要动态维护树的重心。每个连通块以重心为根,用link-cut tree维护每个点的子树大小以及子树内所有点到它的距离和。合并两个连通块时,考虑启发式合并,暴力往大的树中添加叶子。添加叶子时,需要将叶子到重心路径上所有点的子树大小+1,距离和则加上一个等差数列。并且新... 阅读全文
posted @ 2015-09-01 20:33 Claris 阅读(498) 评论(0) 推荐(0) 编辑
摘要: 设$d=\gcd(a,b),a=xd,b=yd$,则$a+b|ab$等价于$x+y|xyd$。因为$x,y$互质,所以$x+y|d$。假设$xtypedef long long ll;const int N=46500,M=505030;int n,m,lim,i,j,d,l,r,vis[N],to... 阅读全文
posted @ 2015-08-31 12:07 Claris 阅读(347) 评论(0) 推荐(0) 编辑
摘要: 对于每条对角线,若需要改变方向,则连边权为1的边,否则连边权为0的边,然后求从左上角到右下角的最短路即可。对于本题,可以用BFS来求最短路,每次扩展时把连通块内所有可以通过0边权的边走到的点加入队尾。时间复杂度$O(n^2)$。#includeconst int N=510,M=251010,T=M... 阅读全文
posted @ 2015-08-23 22:56 Claris 阅读(395) 评论(0) 推荐(0) 编辑
摘要: 以深度建立线段树,线段树父亲节点向儿子节点连边,然后用线段树合并可以得到任何一个点子树的线段树,只需向对应节点的线段树中的$O(\log n)$个点连边即可。为了保证连边关系不发生混乱,线段树需要进行可持久化。这样建图,点数和边数都是$O(n\log n)$级别的,再求出强连通分量,用排列组合求出答... 阅读全文
posted @ 2015-08-23 19:10 Claris 阅读(377) 评论(0) 推荐(0) 编辑
摘要: 设f[i]表示以i为结尾的最长的合法序列的长度,=号直接维护,号用两棵树状数组维护即可,时间复杂度$O(n\log n)$。#include#define N 1000000int n,k,i,j,a[N],e[N+1],bl[N+1],bg[N+1],f[N],ans;char s[N];inli... 阅读全文
posted @ 2015-08-19 23:33 Claris 阅读(221) 评论(0) 推荐(0) 编辑
摘要: 首先将挂饰按照挂钩个数从大到小排序,然后DP设f[i][j]处理完前i个挂饰,还有j个多余挂钩的最大喜悦值,则f[0][1]=0f[i][j]=max(f[i-1][max(j-a[i],0)+1]+b[i],f[i-1][j])时间复杂度$O(n^2)$。#include#include#defi... 阅读全文
posted @ 2015-08-19 19:28 Claris 阅读(332) 评论(0) 推荐(0) 编辑
摘要: 按位考虑,逐步确定答案。设当前是第i位,求出第i位的前缀异或和。若存在m个0且所有数字异或和为0,那么答案的这一位可以为0,并把所有1的位置给标记为不可选。否则答案的这一位只能是1。时间复杂度$O(n\log n)$。#include#define N 500010int n,m,i,j,t,b[N... 阅读全文
posted @ 2015-08-19 17:35 Claris 阅读(403) 评论(0) 推荐(1) 编辑
摘要: 设g[i][j]为i串至少加上几个字符后才能包含j,可以通过Hash求出。然后就是求经过m-1条边的最短路,用倍增加速Floyed即可,时间复杂度$O(n^3\log m)$。#include#include#define rep(i,n) for(int i=0;ib)a=b;}struct ma... 阅读全文
posted @ 2015-08-19 17:31 Claris 阅读(258) 评论(0) 推荐(0) 编辑
摘要: 对于任意两个建筑物,以它们之间的最短路为边权求出最小生成树。则询问(x,y)的答案为最小生成树上x到y路径上边权的最大值。BFS求出离每个点最近的建筑物以及到它的距离,可以发现只有交界处的边才有用,用这些边求MST即可。#include#includeusing namespace std;cons... 阅读全文
posted @ 2015-08-19 02:12 Claris 阅读(520) 评论(0) 推荐(0) 编辑
上一页 1 ··· 23 24 25 26 27 28 29 30 31 ··· 38 下一页