07 2015 档案
摘要:按边权从大到小加边,用Link-Cut Tree维护最小生成树。对于当前要加的边i,最小生成树上边权在[1,R]范围内的和就是询问[e[i].w,R]的答案。因为强制在线,所以用主席树存下所有历史版本即可。时间复杂度。#include#includeusing namespa...
阅读全文
摘要:对于两张卡牌,如果存在两种属性值不互质,则可以匹配。只考虑200以内的质数,一共有46个,可以新建3*46*46个点来表示一类属性值中有这两种质数的卡牌。然后对于每张卡牌,枚举它的质因子,最多只有3个,如此建图求出最大流即可。#includeconst int N=66500,inf=~0U>>2,...
阅读全文
摘要:考虑枚举左端点i,则随着右端点的右移,一共只有种不同的gcd取值。所以首先通过ST表+二分查找预处理出个四元组(x,i,l,r),表示左端点为i,右端点取值范围在[l,r]内,且这一段的gcd都为x。将四元组按照x为第一关键字,i为第二关键字排序,对于相...
阅读全文
摘要:在每条边两个点中间加上一个虚拟点代表这条边权,就可以化边权为点权。把没删掉的边用LCT维护一棵生成树,树边都是桥。对于一条非树边,把树上对应路径上所有边的权值都修改为0,表示都不是桥。然后倒着处理询问,对于每次删掉的边,把两点路径上边权都修改为0。询问等价于查询两点间边权和,若两点连通且路径上不存在...
阅读全文
摘要:首先一遍Dijkstra求出S到每个点的最短路,并建出最短路图。那么对于一条边,求在这条边不能使用的情况下,到首都S的最短时间会变长的点的数目,等价于求去掉这条边后在最短路图中不能从S出发到达的点的数目。对于边x->y,新建一个点z,然后连边x->z->y,这样只需要计算从S到i上必须经过z的点数。...
阅读全文
摘要:考虑分块,每块大小为13,则一共需要38465块,求出b[i]表示前i块的和。查询时中间部分可以查询,只需再往两边累加零散的不超过26个数的和。空间上一共需要开500000的int和38465的long long。#includetypedef long long ll;const in...
阅读全文
摘要:f[i]=min(f[j])+1,线段j与线段i有交,且l[i]-l[j]=x[i],x[j]#includeconst int N=250010,inf=2000000000;int n,L,i,j,k,root,cmp_d,X,Y;struct P{int x,y,l,f,p;}a[N];inl...
阅读全文
摘要:设f[i]为i个点的简单无向连通图数目,则有\[\begin{eqnarray*}f[i]&=&a[i]-\sum_{j=1}^{i-1}C_{i-1}^{j-1}f[j]a[i-j]\\&=&a[i]-c[i]\sum_{...
阅读全文
摘要:最后选择的一定是树上的一个连通块,考虑树分治,每次只需考虑重心必选的情况,这就变成了以重心为根的树形依赖多重背包问题。设f[x][j]表示从根节点到x这条路径及其左边的所有节点,以及以x为根的子树的所有节点中,容量为j的背包选取物品所能得到的最大价值。对于x的儿子y,将f[y]初始值设为f[x]中强...
阅读全文
摘要:对于每组询问,spfa求出f[i][j]表示从S出发,经过j条x边到达i的最短路。若f[T][i]都为inf,则无解。若f[T][0]为inf,则有无穷个解。否则可以看作若干条直线,求出凸壳。算出相邻两条直线交点横坐标并取下整,若刚好为整数则-1,设b[i]为i与i+1的交点的横坐标。则...
阅读全文
摘要:预处理出每个点上下左右能延伸到的最远点以及到它们的距离的最小值md。然后spfa,一个点除了可以以1的代价到达四周的点之外,还可以以md+1的代价到达四个方向能到达的最远点。#includeconst int N=1010,M=4194303;int n,m,i,j,z,x,y,loc[N][N][...
阅读全文
摘要:设f[i]为[1,i]分组的最优解,则f[i]=max(f[j]+1),max(c[j+1],c[j+2],...,c[i-1],c[i])const int N=1000010,M=2097153,P=1000000007,inf=-1000000;int n,i,j,c[N],d[N],g[N]...
阅读全文
摘要:以贝茜为参照物,则贝茜固定于原点,每个杀手是一个圆心在某条射线上的圆。解出每个杀手可以射杀贝茜的时间区间,然后扫描线即可,时间复杂度。#include#include#includeusing namespace std;typedef long long ll;int n,...
阅读全文
摘要:考虑离线求出每个数存在的区间,用时间线段树套链表维护每段区间内存在的数字。然后从线段树根节点开始dfs,子节点的线性基=往父节点的线性基中插入子节点存在的数字后得到的线性基。时间复杂度。#include#includestd::mapvis,loc;inline void...
阅读全文
摘要:2-SAT。建立n个变量,其中第i个变量表示第i个城市是否是首都。对于边(x,y),连边x->y',y->x'。对于一个有y个城市的国家,新建2y个变量,分别表示前i个城市和后i个城市中是否有首都。然后求出SCC,判断是否存在合法的方案即可,时间复杂度。#includeconst i...
阅读全文
摘要:考虑枚举最后中间的数字,然后可以用一个24位的整数来表示一个状态,一共有C(24,8)=735471种状态,然后BFS即可。比赛的时候由于手速问题没写完TAT写完后在坑爹评测机上还是TLE。所以这是经过大量常数优化后的代码。#includestruct P{int a,b,c,d;P(){}P(in...
阅读全文
摘要:将每个串正着插入Trie A中,倒着插入Trie B中。并求出每个串在A,B中的dfs序。每次查询等价于查询在A中dfs序在[la,ra]之间,在B中dfs序在[lb,rb]之间的串的个数,用主席树维护即可。#includeconst int S=2000010,N=2010,M=N*22;char...
阅读全文
摘要:设f[i][j]表示前i个字母中字母j出现的次数对2取模的结果。若[l,r]经过重组可以形成回文串,则需满足f[l-1][j]与f[r][j]至多有1位不同。将f[i]用一个long long表示,枚举不同的那一位,用Hash表支持查询即可。时间复杂度。#include#define...
阅读全文
摘要:fl[i]表示[1,i]操作一次,且在[j+1,i]处操作的最大值1:把[j+1,i]改为b[i]: max(sum[j]+b[i]*(i-j))=b[i]*i+max(-j*b[i]+sum[j])(0#include#define N 500010typedef long long ll;int...
阅读全文
摘要:问题1:ans=max(sum[n]-(sum[i]-sum[j-1])+a[i]*(i-j+1))=max(sum[n]-sum[i]+sum[j-1]+a[i]*(i+1)-a[i]*j)=sum[n]-sum[i]+a[i]*(i+1)+f[i]f[i]=max(-j*a[i]+sum[j-1...
阅读全文
摘要:POI2007完结撒花~首先将n转化为四进制,从低位到高位DPf[i]表示这一位不向下一位借位g[i]表示这一位向下一位借位,但借的那个不算在if[0]=0,g[0]=inff[i]=merge(f[i-1]+b[i],g[i-1]+b[i]+1)g[i]=merge(f[i-1]+4-b[i],g...
阅读全文
摘要:i可以作为起点说明把边反向后可以从1和n到达i。设fl[i]表示从1到达i至少需要加几条边,fr[i]表示从n到达i至少需要加几条边。把图上下翻转后,从左往右依次计算fl[i],有fl[i]=i-1-左边LIS的长度,用树状数组维护即可求出。从右往左计算fr[i]同理。然后需...
阅读全文
摘要:f[i]表示第i个在自己位置上的最大值则f[i]=max(f[j])+1其中j j-a[j]=0j-a[j]>=0发现后两项可以推出第一项,所以是一个LIS问题,排序后树状数组优化DP即可,时间复杂度。#include#include#define N 100010int n...
阅读全文
摘要:论文题。随便取个关键点,求出最短路树。求出所有关键点组成的虚树,将两端都在虚树上的边保留。对剩下的边求出最小生成树即可得到一组可行解。#include#includeconst int N=5010,M=500010,inf=~0U>>1;int n,m,p,i,x,f[N],id[N],ans,c...
阅读全文
摘要:砝码从小到大放最优,二分答案mid,转化为判定前mid小的砝码能否放完。从大到小考虑砝码,依次扫描每个容器,能放就放。由于砝码重量都成倍数关系,所以最多只有种不同的数字,所以总复杂度为。#include#include#define N 100010i...
阅读全文