摘要:
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... 阅读全文
摘要:
设$a[i]=2^{C_i^2}$$b[i]=i!$$c[i]=(i-1)!$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,则有无穷个解。否则可以看作若干条直线,$O(n)$求出凸壳。算出相邻两条直线交点横坐标并取下整,若刚好为整数则-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]... 阅读全文
摘要:
以贝茜为参照物,则贝茜固定于原点,每个杀手是一个圆心在某条射线上的圆。解出每个杀手可以射杀贝茜的时间区间,然后扫描线即可,时间复杂度$O(n\log n)$。#include#include#includeusing namespace std;typedef long long ll;int n,... 阅读全文
摘要:
考虑离线求出每个数存在的区间,用时间线段树套链表维护每段区间内存在的数字。然后从线段树根节点开始dfs,子节点的线性基=往父节点的线性基中插入子节点存在的数字后得到的线性基。时间复杂度$O(31n\log n)$。#include#includestd::mapvis,loc;inline void... 阅读全文
摘要:
2-SAT。建立n个变量,其中第i个变量表示第i个城市是否是首都。对于边(x,y),连边x->y',y->x'。对于一个有y个城市的国家,新建2y个变量,分别表示前i个城市和后i个城市中是否有首都。然后求出SCC,判断是否存在合法的方案即可,时间复杂度$O(n+m)$。#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表支持查询即可。时间复杂度$O(52n)$。#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的长度,用树状数组维护即可$O(n\log n)$求出。从右往左计算fr[i]同理。然后需... 阅读全文
摘要:
f[i]表示第i个在自己位置上的最大值则f[i]=max(f[j])+1其中j j-a[j]=0j-a[j]>=0发现后两项可以推出第一项,所以是一个LIS问题,排序后树状数组优化DP即可,时间复杂度$O(n\log n)$。#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小的砝码能否放完。从大到小考虑砝码,依次扫描每个容器,能放就放。由于砝码重量都成倍数关系,所以最多只有$O(\log n)$种不同的数字,所以总复杂度为$O(n\log^2n)$。#include#include#define N 100010i... 阅读全文
摘要:
考虑把所有石头翻到直线y=x同侧,此时可以保证篱笆长度最短。这种最短的篱笆一共有4种可能,枚举每种可能然后$O(n)$检验求出答案即可。#includeconst int N=1000000,inf=~0U>>1;int n,i,x[N],y[N],w[N],lx=inf,rx,ly=inf,ry,... 阅读全文