摘要: 将S1与S2用#号拼接在一起形成S串将S3与S串跑KMP求出S3在S串中每次出现的位置l[i]对于S串每个后缀i,求出f[i]表示该串不包含S3串的最长前缀然后求出S串的后缀数组先从小到大扫描后缀数组,同时维护一个tmp表示S2中的串与现在的串的最长公共前缀,且没有出现S3,如果碰到一个S1的后缀,... 阅读全文
posted @ 2014-12-12 13:03 Claris 阅读(673) 评论(0) 推荐(0) 编辑
摘要: 怎么3776又换题目了…换题目了…题目了…目了…了…SCC缩点后只有入度或者出度为0的点必须要放警察局假设一共有t-1个入度或者出度为0的SCCq[1]-q[t-1]表示这些SCC中点的个数q[t]表示剩下的点的个数f[i][j]表示前i个部分放了j个警察局的方案数,f[i][j]=sum(f[i-... 阅读全文
posted @ 2014-12-11 18:22 Claris 阅读(213) 评论(0) 推荐(0) 编辑
摘要: 从大到小枚举答案与T串的lcp,然后贪心#include#includechar s[5010],t[5010],ans[5010];int n,m,i,j,a[128],b[128],flag;int main(){ scanf("%s%s",s,t); n=std::strlen(s),m=... 阅读全文
posted @ 2014-12-11 17:38 Claris 阅读(269) 评论(0) 推荐(0) 编辑
摘要: Manacher求出所有极长回文子串后,得到一堆线段,转化成线段覆盖问题预处理出g[i]表示左端点不超过i的右端点的最大值贪心地线段覆盖即可时间复杂度$O(n)$#include#include#include#define N 100010using namespace std;char a[N]... 阅读全文
posted @ 2014-12-11 12:55 Claris 阅读(305) 评论(0) 推荐(0) 编辑
摘要: 从左边不能到达右边当且仅当存在一条与上下底边相连的分割线将它们分开设下底边为S,上底边为T,每个元件作为点,有公共部分的两个点互相连边最后拆点求最小割#include#include#includeusing namespace std;const int N=620,inf=~0U>>2;int ... 阅读全文
posted @ 2014-12-10 12:36 Claris 阅读(582) 评论(0) 推荐(0) 编辑
摘要: $C_{N+M}^N=\frac{(N+M)!}{N!M!}$考虑求出$ans\bmod 10^9$的值$10^9=2^9\times5^9$以$2^9$为例,先预处理出$1$..$2^9$中不是2的倍数的数的前缀积s[],显然$n!\bmod 2^9$有着长度为$2^9$的循环节将答案表示成$a\... 阅读全文
posted @ 2014-12-07 20:13 Claris 阅读(396) 评论(0) 推荐(0) 编辑
摘要: 这题显然是一个最小斯坦纳树的模型,直接上模板即可,就是正六边形比较恶心。#include#include#include#include#define rep(i,n) for(int i=0;iP;int R,n,m,k=4,f[N][1Q;int read(){ char ch; while... 阅读全文
posted @ 2014-12-07 15:33 Claris 阅读(191) 评论(0) 推荐(0) 编辑
摘要: 将序列分成$\sqrt{n}$块,预处理出每两块之间的逆序对数,以及ap[i]表示前i块内数字出现次数的树状数组预处理:$O(n\sqrt{n}\log n)$修改时,ap[i]可以在$O(\sqrt{n}\log n)$复杂度内完成修改,然后考虑修改的位置对答案的贡献,可以发现相当于某一行、某一列... 阅读全文
posted @ 2014-12-03 18:22 Claris 阅读(419) 评论(0) 推荐(0) 编辑
摘要: 由于没有换根操作,所以直接用Splay维护DFS括号序列即可。对于查询1到x路径和,就是已入栈的减去已出栈的。子树加相当于区间加。换父亲相当于一个区间的移动。本题非常卡常数,一开始直接扒3153的代码狂T不止,改写Splay后也是狂T不止,最后把Splay从数组储存改成结构体储存才AC。#inclu... 阅读全文
posted @ 2014-12-02 18:15 Claris 阅读(412) 评论(0) 推荐(0) 编辑
摘要: 从低位到高位数位DP,f[i][j][k]表示已经填了后i位,转化的数字为j,后i位与x后i位的大小关系为k的方案数。#includeconst int N=202,B=7,P=(1P)c.x[i+1]++,c.x[i]&=P; return c; } Num operator-(Num ... 阅读全文
posted @ 2014-11-30 12:36 Claris 阅读(410) 评论(0) 推荐(0) 编辑
摘要: 设第$i$条直线的解析式为$a_ix+b_iy+c_i=0$,$d_i=a_i^2+b_i^2$,则要求一个点$(x,y)$,使得$\sum\left(\frac{\left|a_ix+b_iy+c_i\right|}{\sqrt{d_i}}\right)^2$最小。 假设$x$固... 阅读全文
posted @ 2014-11-28 19:42 Claris 阅读(617) 评论(0) 推荐(0) 编辑
摘要: 树上莫队,有几个坑:a可能等于b数据范围是100000#include#include#include#define N 100010#define K 17using namespace std;inline void read(int&a){char c;while(!(((c=getchar(... 阅读全文
posted @ 2014-11-25 13:34 Claris 阅读(333) 评论(0) 推荐(0) 编辑
摘要: l[i],r[i]表示站在i点往左往右走能看到的最高峰,用栈维护凸壳求出h[i]表示i点能看到的最高峰的高度a[i],b[i]表示i点往左往右走时反悔的点,即第一个h[j]>h[i]的j,用单调栈求出然后建树DFS一遍求出答案#include#define N 200010typedef long ... 阅读全文
posted @ 2014-11-25 12:27 Claris 阅读(391) 评论(0) 推荐(0) 编辑
摘要: FFT后减去重复选取的方案数。#include#include#includeusing namespace std;typedef long long ll;const int N=131072;int n,i,m,k;ll ans[N],sum[N],f1[N],f2[N];struct com... 阅读全文
posted @ 2014-11-24 18:19 Claris 阅读(402) 评论(0) 推荐(0) 编辑
摘要: 枚举第一个位置,然后暴力检验。#include#define N 1010int T,n,m,a,b,x,y,i,j,k,q[N*N][2],cnt;char s[N][N],ts[N];bool v[N][N];bool solve(){ scanf("%d%d%d%d",&n,&m,&a,&b... 阅读全文
posted @ 2014-11-20 17:39 Claris 阅读(412) 评论(0) 推荐(0) 编辑
摘要: 设f[i][S]表示第i份食物被两个人吃的状态为S是否有可能,枚举f[1][]的情况后检验f[i][0]=(f[i-1][1]&a[i-1]>=a[i])|(f[i-1][3]&a[i-1]>=2*a[i])f[i][1]=(f[i-1][1]&2*a[i-1]>=a[i])|(f[i-1][3]&... 阅读全文
posted @ 2014-11-17 21:09 Claris 阅读(539) 评论(0) 推荐(0) 编辑
摘要: 首先预处理出[1,i]的答案设nxt[i]表示i下一次出现的位置随着左端点l往右移,[l+1,nxt[l]-1]里答案都减去它的价值,[nxt[l],nxt[nxt[l]]-1]里答案都加上它的价值线段树维护#include#define N 1000010typedef long long ll;... 阅读全文
posted @ 2014-11-17 21:06 Claris 阅读(472) 评论(0) 推荐(0) 编辑
摘要: NOIP前做了几道POI,现在终于能在BZOJ上提交了…交上去最后几个点WA,看了数据发现p=0的特判错了…p=0,1时特判p=2时构造两种情况判断p=3时不考虑1的座位进行DP可以发现对于i+1的位置安排,我们只关心i-2,i-1,i的相对顺序以及它们的相邻、边界情况所以设f[i][j][S1][... 阅读全文
posted @ 2014-11-17 21:05 Claris 阅读(833) 评论(0) 推荐(1) 编辑
摘要: 考虑枚举右端点,用线段树维护[i,nowr]的答案。当右端点向右延伸时,需要知道它前面第一个比它大/小的数的位置,这里面的最值将发生改变,这个使用单调队列求出,然后将所有的l都加1。注意常数优化。#include#define PB int mid=(a+b)>>1,l=x='0')&&(c='0'... 阅读全文
posted @ 2014-11-15 13:45 Claris 阅读(1057) 评论(2) 推荐(0) 编辑
摘要: 分块预处理出[i,j]块内的答案以及数字出现次数,查询时向两边转移,用树状数组维护,复杂度$O((n+m)\sqrt{n}\log n)$。#include#includeconst int N=50010,K=226;int n,m,l,r,i,j,k,size,block,a[N],b[N],p... 阅读全文
posted @ 2014-11-14 15:36 Claris 阅读(296) 评论(0) 推荐(0) 编辑