摘要: 按照顺序依次找到b串每个字母最后的位置,然后求逆序对。#include#define N 1000010int n,i,j,k,g[26],nxt[N],bit[N];char a[N],b[N];long long ans;int main(){ for(scanf("%d",&n),gets(... 阅读全文
posted @ 2015-01-24 17:37 Claris 阅读(168) 评论(0) 推荐(0) 编辑
摘要: 若x到y走k步可行,那么走k+2步也可行以每个点为起点,BFS处理出到每个点走了奇数步、偶数步的最短路对于一次询问,如果d不小于相应奇偶性的最短路,则可行特判:对于孤立点,无论怎么走都不可行#includeconst int N=10010,Q=1000010;int n,m,k,i,j,x,y,z... 阅读全文
posted @ 2015-01-24 17:09 Claris 阅读(436) 评论(0) 推荐(0) 编辑
摘要: BZOJ AC1000题纪念~~~将x到y路径上的点权从小到大排序如果不存在b[i]使得b[i]+b[i+1]>b[i+2]则无解此时b数列增长速度快于斐波那契数列,当达到50项时就会超过int的范围所以暴力查询,如果路径长度达到50就肯定有解,否则暴力排序检验#include#include#de... 阅读全文
posted @ 2015-01-24 13:47 Claris 阅读(367) 评论(0) 推荐(0) 编辑
摘要: 先去重,然后一维排序,二维分治,三维树状数组维护,$O(n\log^2n)$#include#include#define N 100010using std::sort;int n,m,k,i,j,t1,t2,b[N],c[N],fin[N],bit[N='0')&&(c='0')&&(c>1; ... 阅读全文
posted @ 2015-01-23 23:46 Claris 阅读(254) 评论(0) 推荐(0) 编辑
摘要: 首先离散化颜色设pre[x]表示与x颜色相同的点上一次出现的位置,对于每种颜色开一个set维护修改时需要修改x、x修改前的后继、x修改后的后继询问[l,r]等价于询问[l,r]内pre[x]#include#include#include#define N 100010using namespace... 阅读全文
posted @ 2015-01-22 22:43 Claris 阅读(275) 评论(0) 推荐(0) 编辑
摘要: 对Alice的所有串构造AC自动机,并建出Fail树每当Bob添加一个串时,在AC自动机上走,每走到一个点,就把它到根路径上所有点的答案+1需要注意的是每次操作,相同的点只能被加一次所以在需要操作的点构成的虚树上进行修改操作,避免重复修改对于修改,x到根路径上所有点答案+1等价于在x点打上一个标记,... 阅读全文
posted @ 2015-01-21 18:33 Claris 阅读(693) 评论(0) 推荐(0) 编辑
摘要: 线段树套Treap外层的线段树需要动态开节点内层Treap需要注意的是,相同y坐标的点不一定是同一个点,所以需要再次离散空间$O(n\log n)$时间$O(n\log^2n)$#include#include#define N 705000typedef long long ll;int n,m,... 阅读全文
posted @ 2015-01-21 11:09 Claris 阅读(505) 评论(0) 推荐(0) 编辑
摘要: f[0][i]为i出发的最长路,f[1][i]为到i的最长路新建源汇S,T,S向每个点连边,每个点向T连边将所有点划分为两个集合S与T,一开始S中只有S,其它点都在T中用一棵线段树维护所有连接属于两个集合的点的边,权值为f[1][u]+f[0][v]按拓扑序依次计算去掉每个点后图中的最长路对于当前计... 阅读全文
posted @ 2015-01-18 15:39 Claris 阅读(780) 评论(0) 推荐(2) 编辑
摘要: 求出S串的后缀树,则两个后缀的lcp等于其lca到根的距离对于每次询问,对这些节点构造虚树,然后树形DP即可#include#includeusing std::sort;typedef long long ll;const int inf=1='0')&&(c='0')&&(c=tree[node... 阅读全文
posted @ 2015-01-18 12:40 Claris 阅读(637) 评论(0) 推荐(0) 编辑
摘要: 设i点的度数为d[i]则如果有x只蚂蚁在从i走到别处,会分裂成每群$\lfloor\frac{x}{d[i]-1}\rfloor$只蚂蚁对于x出发的m只蚂蚁,到y处还剩$\lfloor\frac{m}{x到y路径上所有点度数-1的乘积}\rfloor$于是我们一遍DFS求出到每个叶子节点时一路上点度... 阅读全文
posted @ 2015-01-17 16:46 Claris 阅读(351) 评论(0) 推荐(0) 编辑
摘要: 设d[i]表示i到1的距离f[i]=w[i]+min(f[j]+(d[i]-d[j])*v[i])=w[i]+d[i]*v[i]+min(-d[j]*v[i]+f[j])对这棵树进行点分治,每次递归时的根为x,重心为rt如果x==rt,则把树中所有点用x暴力更新,然后递归分治否则,先递归分治x的那部... 阅读全文
posted @ 2015-01-15 21:12 Claris 阅读(453) 评论(0) 推荐(0) 编辑
摘要: 设d[i]表示i到1的距离f[i]=w[i]+min(f[j]+(d[i]-d[j])*v[i])=w[i]+d[i]*v[i]+min(-d[j]*v[i]+f[j])对这棵树进行点分治,每次递归时的根为x,重心为rt如果x==rt,则把树中所有点用x暴力更新,然后递归分治否则,先递归分治x的那部... 阅读全文
posted @ 2015-01-15 20:25 Claris 阅读(583) 评论(0) 推荐(0) 编辑
摘要: 每个点最多被修改$O(\log n)$次,线段树记录区间最值暴力更新。#include#define N 262145int T,n,m,i,op,c,d,p,s[N],v[N],tag[N];inline void read(int&a){char c;while(!(((c=getchar())... 阅读全文
posted @ 2015-01-12 19:15 Claris 阅读(200) 评论(0) 推荐(0) 编辑
摘要: 对于每次询问,构造出虚树,相邻两点边权为该两点路径上边权的最小值f[i]表示以i为根的子树与1不连通的最小代价,vip[i]表示i是不是关键点f[i]=sum(vip[j]?w[j]:min(f[j],w[j]))#include#include#define N 250010#define K 1... 阅读全文
posted @ 2015-01-12 18:26 Claris 阅读(188) 评论(0) 推荐(0) 编辑
摘要: 首先旋转坐标系,将范围表示成矩形或者射线如果范围是一条线,则将灯按y坐标排序,y坐标相同的按x坐标排序,对于y相同的灯,f[i]=min(i,它前面灯发光时刻的第k[i]小值),线段树维护,$O(n\log n)$如果范围是一个矩形,则将灯按x坐标排序,x坐标相同的按y坐标排序,从左往右、从下到上依... 阅读全文
posted @ 2015-01-11 17:00 Claris 阅读(484) 评论(0) 推荐(0) 编辑
摘要: 设h为树的高度,sum[i]为深度大于i的点的个数则$ans=\max(i+\lceil\frac{sum[i]}{k}\rceil)$注意到这是一条直线,于是斜率优化至$O(n)$#include#define N 1000010typedef long long ll;int n,m,i,x,g... 阅读全文
posted @ 2015-01-10 13:25 Claris 阅读(667) 评论(0) 推荐(1) 编辑
摘要: 把环倍长,破环成链设f[i]表示i一次性能飞达的最右边的点,因为f[]单调递增,所以可以$O(n)$求出这样就形成了一个树结构,对于每个节点,在其到根节点路径上二分出深度最大的点,使得其飞过一圈常数优化:注意到答案只有两种,所以可以进行最优性剪枝内存优化:只需要开3个200W的数组即可,分别表示相邻... 阅读全文
posted @ 2015-01-08 20:53 Claris 阅读(331) 评论(0) 推荐(0) 编辑
摘要: 首先为了保证发车时间都不同,T[i]=max(T[i],T[i-1]+1)然后设f[i]表示前i列车回来的最早时刻f[i]=min(max(T[i],f[j]+i-j-1)+s*2+i-j-1)=min(max(-j+T[i],f[j]-2*j+i-1))+s*2+i-1=min(min(-j)+T... 阅读全文
posted @ 2015-01-08 13:14 Claris 阅读(518) 评论(0) 推荐(0) 编辑
摘要: 1 n d v相当于给$a[x]+=v[\gcd(x,n)=d]$\[\begin{eqnarray*}&&v[\gcd(x,n)=d]\\&=&v[\gcd(\frac{x}{d},\frac{n}{d})=1]\\&=&v\sum_{k|\gcd(\frac{x}{d},\frac{n}{d})... 阅读全文
posted @ 2015-01-07 19:38 Claris 阅读(655) 评论(0) 推荐(0) 编辑
摘要: 注意到集结操作相当于合并一些点于是我们可以使用并查集对于每一行、每一列维护一个链表,储存里面的点查询x时,在并查集中找到x的祖先u,此时x的坐标就是u的坐标然后扫描u所在行列的链表,依次删除每个点,并把这些点合并成一个新点,同时计算贡献对于修改操作,可以看作是分离,新建一个点代表修改后的点,然后对于... 阅读全文
posted @ 2015-01-07 17:35 Claris 阅读(335) 评论(0) 推荐(0) 编辑