首页 > FCS省选模拟赛 Day5

FCS省选模拟赛 Day5

传送门

Solution



Code 

#include
#define ll long long
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
inline int read()
{int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}return x*f;
}
const int inf=0x3f3f3f3f,MN=105,T=235,S=0,TT=245;
int n,m,k,nx[MN],ny[MN],ans;
bool mp[MN][MN];
int d[TT],q[TT],top;
struct edge{int to,w,nex;}e[MN*MN*2];int hr[TT],cur[TT],en=1;
inline void ins(int f,int t,int w)
{e[++en]=(edge){t,w,hr[f]};hr[f]=en;e[++en]=(edge){f,0,hr[t]};hr[t]=en;
}
bool bfs(){memset(d,0,sizeof d);register int i,j;for(d[q[top=i=1]=S]=1;i<=top;i++)for(j=hr[q[i]];j;j=e[j].nex)if(e[j].w&&!d[e[j].to])d[q[++top]=e[j].to]=d[q[i]]+1;return d[T];
}
int dfs(int x,int f){if(x==T) return f;int used=0;for(int &i=cur[x];i;i=e[i].nex)if(e[i].w&&d[e[i].to]==d[x]+1){int w=dfs(e[i].to,min(e[i].w,f-used));used+=w;e[i].w-=w;e[i^1].w+=w;if(used==f) return used;}return d[x]=-1,used;
}
inline void dinic()
{while(bfs()){memcpy(cur,hr,sizeof cur);ans-=dfs(S,inf);}
}
int main()
{register int i,j,x,y;n=read();m=read();k=read();for(i=1;i<=n;++i) nx[i]=m-read();for(i=1;i<=m;++i) ny[i]=n-read();for(i=1;i<=k;++i) x=read(),y=read(),--nx[x],--ny[y],mp[x][y]=true;for(i=1;i<=n;++i) if(nx[i]<0) return 0*puts("IIllIIll1!");for(i=1;i<=m;++i) if(ny[i]<0) return 0*puts("IIllIIll1!");for(i=1;i<=n;++i) ins(S,i,nx[i]);for(i=1;i<=m;++i) ins(i+MN,T,ny[i]);for(i=1;i<=n;++i)for(j=1;j<=m;++j) if(!mp[i][j]) ins(i,j+MN,1);ans=n*m-k;dinic();return 0*printf("%d
",ans);
}



/*
rongchi : f_n=d_n-a_n a_n:num of n's factor that is not QQn
Sum d_i easy = sum (N/i)
sum a_n =sum mu[i]^2 * (n/i)
mobi : sum mu[i]^2 = sum mu[i]*N/(i^2)
*/
#include
#define ll long long
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
inline int read()
{int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}return x*f;
}
const int MN=35000;
ll mu[MN],prime[MN],tot;
bool mk[MN]; 
inline void init()
{mu[1]=1;register int i,j;for(i=2;i



/*
后缀自动机+线段树合并
对Fail树进行dfs
每个点的level应该是祖先中满足出现次数大于1的最大lev+1
如果没有,level等于祖先中最大的lev
判断出现次数,用线段树区间求和
为什么实现是每个节点只需考虑它的最大len?
如果有小的len,它每次出现时必然伴随最大的len一同出现,所以不影响
2019/3/20 by pac
*/
#include
#define ll long long
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
const int MN=2e5+5,MX=4e5+5,MS=1e7+5;
char s[MN+5];
int len;
class Seg
{int ls[MS],rs[MS],v[MS],root[MX],tot;void Md(int &x,int l,int r,int a,int ad){if(!x) x=++tot;if(l==r){v[x]+=ad;return;}int mid=(l+r)>>1;if(a<=mid) Md(ls[x],l,mid,a,ad);else Md(rs[x],mid+1,r,a,ad);v[x]=v[ls[x]]+v[rs[x]];}int Qy(int x,int l,int r,int a,int b){if(!x) return 0;if(l==a&&r==b){return v[x];}int mid=(l+r)>>1;if(b<=mid) return Qy(ls[x],l,mid,a,b);if(a>mid) return Qy(rs[x],mid+1,r,a,b);return Qy(ls[x],l,mid,a,mid)+Qy(rs[x],mid+1,r,mid+1,b);}int Merge(int x,int y,int l,int r){if(!x||!y) return x|y;int o=++tot;v[o]=v[x]+v[y];int mid=(l+r)>>1;ls[o]=Merge(ls[x],ls[y],l,mid);rs[o]=Merge(rs[x],rs[y],mid+1,r);return o;}public:void md(int x,int k){Md(root[x],1,len,k,1);}bool qy(int x,int l,int r){return Qy(root[x],1,len,l,r)>=2;}int merge(int x,int y){root[x]=Merge(root[x],root[y],1,len);}
}T;
class SAM
{int c[MX][26],fa[MX],step[MX],pos[MX];int last,cnt,n;int ans=0,lev[MX];struct ed{int to,nex;}e[MX<<1];int en,hr[MX];void ins(int x,int y){e[++en]=(ed){y,hr[x]};hr[x]=en;}void pre_dfs(int x){register int i;for(i=hr[x];i;i=e[i].nex)pre_dfs(e[i].to),pos[x]=max(pos[x],pos[e[i].to]),T.merge(x,e[i].to);}void dfs(int x,int mx){if(x!=1&&(T.qy(mx,pos[x]-step[x]+step[mx],pos[x])||step[x]==1)) lev[x]=lev[mx]+1,mx=x;else lev[x]=lev[mx];register int i;for(i=hr[x];i;i=e[i].nex) dfs(e[i].to,mx);ans=max(ans,lev[x]);}public:inline void init(){cnt=last=1;n=0;for(int i=1;i<=n<<1;++i)memset(c[i],0,sizeof c[i]),lev[i]=step[i]=fa[i]=0;}void Insert(int x){int p=last,np=++cnt;step[np]=step[p]+1;T.md(np,pos[np]=++n);for(;p&&!c[p][x];p=fa[p]) c[p][x]=np;if(!p) fa[np]=1;else {int q=c[p][x];if(step[q]==step[p]+1) fa[np]=q;else {int nq=++cnt;step[nq]=step[p]+1;memcpy(c[nq],c[q],sizeof c[q]);fa[nq]=fa[q];fa[np]=fa[q]=nq;for(;c[p][x]==q;p=fa[p]) c[p][x]=nq;}    }last=np;}void solve(){register int i;for(i=2;i<=cnt;++i) if(fa[i]) ins(fa[i],i);pre_dfs(1);dfs(1,1);printf("%d
",ans);}
}sam;
int main()
{scanf("%s",s+1);len=strlen(s+1);sam.init();register int i;for(i=1;i<=len;++i) sam.Insert(s[i]-'a');sam.solve();return 0;
}




Blog来自PaperCloud,未经允许,请勿转载,TKS!

转载于:https://www.cnblogs.com/PaperCloud/p/FCS_noi2019_mn_d5.html

更多相关:

  •         Apache POI是一个开源的利用Java读写Excel,WORD等微软OLE2组件文档的项目。        我的需求是对Excel的数据进行导入或将数据以Excel的形式导出。先上简单的测试代码:package com.xing.studyTest.poi;import java.io.FileInputSt...

  • 要取得[a,b)的随机整数,使用(rand() % (b-a))+ a; 要取得[a,b]的随机整数,使用(rand() % (b-a+1))+ a; 要取得(a,b]的随机整数,使用(rand() % (b-a))+ a + 1; 通用公式:a + rand() % n;其中的a是起始值,n是整数的范围。 要取得a到b之间的...

  • 利用本征图像分解(Intrinsic Image Decomposition)算法,将图像分解为shading(illumination) image 和 reflectance(albedo) image,计算图像的reflectance image。 Reflectance Image 是指在变化的光照条件下能够维持不变的图像部分...

  • 题目:面试题39. 数组中出现次数超过一半的数字 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。 你可以假设数组是非空的,并且给定的数组总是存在多数元素。 示例 1: 输入: [1, 2, 3, 2, 2, 2, 5, 4, 2] 输出: 2 限制: 1 <= 数组长度 <= 50000 解题: cl...

  • 题目:二叉搜索树的后序遍历序列 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true,否则返回 false。假设输入的数组的任意两个数字都互不相同。 参考以下这颗二叉搜索树:      5     /    2   6   /  1   3示例 1: 输入: [1,6,3,2,5] 输出...

  • /*判断屏幕宽高比是否为16:9*/ function isScreen16to9() {return window.screen.height / window.screen.width === 9 / 16; }...

  • /*关闭、刷新、跳转、离开当前网页前提示*/ onbeforeunload = function () {return false; };  ...

  • let json = {/**判断JSON格式*/ isJSON: function (str) {if (typeof str == "string") {try {var obj = JSON.parse(str);if (typeof obj == "object" && obj) {return true;} else {...

  •   项目结构   index.js //必须要安装否则就别想运行了❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤ //npm i body-parser -D & cnpm i express & cnpm i node-xlsx & cnp...

  • 一、递归 函数    为什么要有函数,提高代码的可读性,避免重复的代码,提高代码的复用性      在函数中能用return的不要print 1、递归的最大深度997 def foo(n):print(n)n+=1foo(n) foo(1) 递归的最大深度 2、修改递归的最大深度     由此我们可以看出,未报错之前能看到的最大数...

  • #include #include #include #include #include #include #include

  • 题目:表示数值的字符串 请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100"、"5e2"、"-123"、"3.1416"、"0123"及"-1E-16"都表示数值,但"12e"、"1a3.14"、"1.2.3"、"+-5"及"12e+5.4"都不是。 解题: 数值错误的形式有多种多样,但是正确的...

  • 加法伺候  //超过20位数值相加---------------------------------------- function bigNumAdd(a, b) {if (!(typeof a === "string" && typeof b === "string")) return console.log("传入参数必...

  • 业务场景: 从中文字句中匹配出指定的中文子字符串 .这样的情况我在工作中遇到非常多, 特梳理总结如下. 难点: 处理GBK和utf8之类的字符编码, 同时正则匹配Pattern中包含汉字,要汉字正常发挥作用,必须非常谨慎.推荐最好统一为utf8编码,如果不是这种最优情况,也有酌情处理. 往往一个具有普适性的正则表达式会简化程...

  • 简单record 一下 #include // 'struct sockaddr_in' #include #include // 'struct ifreq' and 'struct if_nameindex' #include #inc...