摘要:
注意到f(n)不会超过1459,于是暴力枚举f(n),检验n=k*f(n)是否合法即可。#includelong long k,a,b,t;int i,j,ans;int main(){ scanf("%lld%lld%lld",&k,&a,&b); for(i=1;i<=1459&&k<=b/... 阅读全文
摘要:
不管怎么修改,所有数字的排名都不会发生变化。将a[]从小到大排序之后,维护一棵线段树,在上面修改。对于收割操作,在线段树上二分,找到需要修改的后缀进行区间赋值即可。时间复杂度$O(m\log n)$。#include#include#define N 1050000typedef long long... 阅读全文
摘要:
线段树每个区间维护上下界以及要整体增加的标记即可,时间复杂度$O(m\log n)$。#include#define inf 1500000000int n,m,op,c,d,p;struct Node{int l,r,t;}T[1050000];inline void read(int&a){ ... 阅读全文
摘要:
首先在串的末尾加上1000,然后进行归并,每次取字典序较小的那个后缀即可。用hash+二分支持查询lcp,时间复杂度$O(n\log n)$。#includetypedef long long ll;const int N=200010,P=31,D=1000173169;int n,m,i,j,k... 阅读全文
摘要:
假设分成如下三段:[1..i][i+1..j][j+1..n]考虑中间那一段,设f[i]为前i位组成的数模q的值,pow[i]为$10^i$模q的值,那么有:f[j]-f[i]*pow[j-i]=0f[j]*pow[i]=f[i]*pow[j]f[j]*inv(pow[j])=f[i]*inv(po... 阅读全文
摘要:
建立线段树,S向每个叶子连边,容量1,费用0。孩子向父亲连边,容量inf,费用0。每个强盗向T连边,容量1,费用为c[i]。对应区间内的点向每个强盗,容量1,费用0。求最大费用流即可。#includeconst int inf=~0U>>2,N=15010,M=1000000;int n,i,A,B... 阅读全文
摘要:
设f[i][j]为a[1..i]与b[1..j]的LCS,g[i][j]为a[i..n]与b[j..m]的LCS。若C为0,则ans=f[n][m]。否则求出d[i]=a中从i开始往右匹配上c串的位置以及e[i]=b中从i开始往右匹配上c串的位置。则ans=max(f[i-1][j-1]+g[d[i... 阅读全文