摘要:
从左往右维护两个指针l,r表示离i最近的k个点的区间,预处理出每个点出发的后继,然后倍增。#includetypedef long long ll;const int N=1000010,BUF=20000000,OUT=8000000;int n,k,i,l=1,r,f[N],g[N],t[N],... 阅读全文
摘要:
在线做法:若p不超过100,则可以先预处理,将所有满足a[x]%i=j的x从小到大放进链表q[i][j]中,查询时二分预处理:$O(100n)$查询:$O(\log n)$若p超过100,则满足条件的a[x]一定不超过100种于是维护一个二维数组T,T[i][j]表示在前j个数里多有少个的权值是i为... 阅读全文
摘要:
CANCEL操作可以看作删点,X坐标可以离散化将询问按Z坐标差分,转化成两个求Z#include#include#define N 600010using std::sort;int n,m,Q,i,j,x,y,z,r,t1,t2,fin[N],L[N],li,k,q[N],t,pos[N],T,C... 阅读全文
摘要:
二分答案mid,然后检验是否存在两个相同的mid*mid的正方形检验方法:首先对于每个位置,求出它开始长度为mid的横行的hash值然后对于hash值再求一次竖列的hash值将第二次求出的hash值排序,如果存在两个相同的hash值则可行#include#include#define N 510ty... 阅读全文
摘要:
按照顺序依次找到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(... 阅读全文
摘要:
若x到y走k步可行,那么走k+2步也可行以每个点为起点,BFS处理出到每个点走了奇数步、偶数步的最短路对于一次询问,如果d不小于相应奇偶性的最短路,则可行特判:对于孤立点,无论怎么走都不可行#includeconst int N=10010,Q=1000010;int n,m,k,i,j,x,y,z... 阅读全文
摘要:
BZOJ AC1000题纪念~~~将x到y路径上的点权从小到大排序如果不存在b[i]使得b[i]+b[i+1]>b[i+2]则无解此时b数列增长速度快于斐波那契数列,当达到50项时就会超过int的范围所以暴力查询,如果路径长度达到50就肯定有解,否则暴力排序检验#include#include#de... 阅读全文
摘要:
先去重,然后一维排序,二维分治,三维树状数组维护,$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; ... 阅读全文
摘要:
首先离散化颜色设pre[x]表示与x颜色相同的点上一次出现的位置,对于每种颜色开一个set维护修改时需要修改x、x修改前的后继、x修改后的后继询问[l,r]等价于询问[l,r]内pre[x]#include#include#include#define N 100010using namespace... 阅读全文
摘要:
对Alice的所有串构造AC自动机,并建出Fail树每当Bob添加一个串时,在AC自动机上走,每走到一个点,就把它到根路径上所有点的答案+1需要注意的是每次操作,相同的点只能被加一次所以在需要操作的点构成的虚树上进行修改操作,避免重复修改对于修改,x到根路径上所有点答案+1等价于在x点打上一个标记,... 阅读全文
摘要:
线段树套Treap外层的线段树需要动态开节点内层Treap需要注意的是,相同y坐标的点不一定是同一个点,所以需要再次离散空间$O(n\log n)$时间$O(n\log^2n)$#include#include#define N 705000typedef long long ll;int n,m,... 阅读全文
摘要:
f[0][i]为i出发的最长路,f[1][i]为到i的最长路新建源汇S,T,S向每个点连边,每个点向T连边将所有点划分为两个集合S与T,一开始S中只有S,其它点都在T中用一棵线段树维护所有连接属于两个集合的点的边,权值为f[1][u]+f[0][v]按拓扑序依次计算去掉每个点后图中的最长路对于当前计... 阅读全文
摘要:
求出S串的后缀树,则两个后缀的lcp等于其lca到根的距离对于每次询问,对这些节点构造虚树,然后树形DP即可#include#includeusing std::sort;typedef long long ll;const int inf=1='0')&&(c='0')&&(c=tree[node... 阅读全文
摘要:
设i点的度数为d[i]则如果有x只蚂蚁在从i走到别处,会分裂成每群$\lfloor\frac{x}{d[i]-1}\rfloor$只蚂蚁对于x出发的m只蚂蚁,到y处还剩$\lfloor\frac{m}{x到y路径上所有点度数-1的乘积}\rfloor$于是我们一遍DFS求出到每个叶子节点时一路上点度... 阅读全文
摘要:
设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的那部... 阅读全文
摘要:
设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的那部... 阅读全文
摘要:
每个点最多被修改$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())... 阅读全文
摘要:
对于每次询问,构造出虚树,相邻两点边权为该两点路径上边权的最小值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... 阅读全文
摘要:
首先旋转坐标系,将范围表示成矩形或者射线如果范围是一条线,则将灯按y坐标排序,y坐标相同的按x坐标排序,对于y相同的灯,f[i]=min(i,它前面灯发光时刻的第k[i]小值),线段树维护,$O(n\log n)$如果范围是一个矩形,则将灯按x坐标排序,x坐标相同的按y坐标排序,从左往右、从下到上依... 阅读全文
摘要:
设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... 阅读全文