传送门

Solution

Code

#include<bits/stdc++.h>
#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\n",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<bits/stdc++.h>
#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<MN;++i){if(!mk[i]){prime[++tot]=i;mu[i]=-1;}for(j=1;j<=tot&&i*prime[j]<MN;++j){mk[i*prime[j]]=true;if(i%prime[j]==0){mu[i*prime[j]]=0;break;}else mu[i*prime[j]]=-mu[i];}}
}
ll get_d(int N)
{ll ans=0;register int l=1,r;for(;l<=N;l=r+1){r=N/(N/l);ans+=1ll*(N/l)*(r-l+1);}return ans;
}
ll Pre(int N)
{register int i;ll ans=0;for(i=1;i*i<=N;++i) ans+=1ll*mu[i]*(N/i/i);return ans;
}
ll get_a(int N)
{register int l=1,r;ll ans=0;for(;l<=N;l=r+1){r=N/(N/l);ans+=1ll*(Pre(r)-Pre(l-1))*(N/l);}return ans;
}
ll get(int N)
{if(!N) return 0ll;return get_d(N)-get_a(N);
}
int main()
{ll L,R;init();L=read(),R=read();printf("%lld\n",get(R)-get(L-1));
}
/*
后缀自动机+线段树合并
对Fail树进行dfs
每个点的level应该是祖先中满足出现次数大于1的最大lev+1
如果没有,level等于祖先中最大的lev
判断出现次数,用线段树区间求和
为什么实现是每个节点只需考虑它的最大len?
如果有小的len,它每次出现时必然伴随最大的len一同出现,所以不影响
2019/3/20 by pac
*/
#include<bits/stdc++.h>
#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\n",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

FCS省选模拟赛 Day5相关推荐

  1. FCS省选模拟赛 Day7

    Description Solution T1 island 考虑把问题成两部分计算 纵坐标的距离和很好计算,在输入的同时一次计算了就完事 横坐标又分成两部分 分别在\(y\)轴不同侧的矩形的距离和同 ...

  2. 省选模拟赛记录(越往下越新哦~~~)

    LOG 模拟赛 第一次见尼玛这么给数据范围的-- 开考有点困,迷迷糊糊看完了三道题,真的是像老吕说的那样,一道都不会-- 思考T1,感觉有点感觉,但是太困了,就先码了暴力,发现打表可以50分,于是就大 ...

  3. 省选模拟赛2022/3/23

    省选模拟赛2022/3/23 比赛时间安排 赛后总结反思 与正解的差距 T1 T2 T3 比赛时间安排 7.30-7.40 t1 n<=10,全排列一下跳叶子结点的顺序暴力搞 t2 题意感觉好复 ...

  4. 省选模拟赛2022/3/31

    省选模拟赛2022/3/31 比赛时间安排 赛后反思总结 与正解的差距 T3 比赛时间安排 7.50-8.10 t1 暴力复杂度都很大啊,完全没想法 t2 dfs可以试一试,但是感觉复杂度还是会炸,想 ...

  5. 省选模拟赛(正睿的最后一场)

    省选模拟赛(正睿的最后一场!!) 比赛时间安排 与正解的差距 T1 比赛时间安排 7.30-7.40 t1 能拿10分dfs,n=0的情况或许可以找规律 t2 看不懂 t3 暴力挺好写的,求lca太麻 ...

  6. NOI2019省选模拟赛 第五场

    爆炸了QAQ 传送门 \(A\) \(Mas\)的童年 这题我怎么感觉好像做过--我记得那个时候还因为没有取\(min\)结果\(100\to 0\)-- 因为是个异或我们肯定得按位考虑贡献了 把\( ...

  7. test 7 3-22 2021省选模拟赛seven

    文章目录 考试复盘 人生 赢家 黑红兔 考试复盘 T1T1T1 subtask1:n≤5subtask1:n\le 5subtask1:n≤5,暴搜点的颜色状态以及边的存在状态 对于一条连接相同颜色点 ...

  8. 20200515省选模拟赛B、幻化成风(毒瘤容斥题+构造容斥系数+生成函数+hash状压DP+Trie树优化背包)

    题解 花了一上午+一中午终于把这道题A了 首先,我们要求的是bi互不相同的合法方案数 我们可以枚举一个a的集合S,来强制里面的b全部都相同,然后其它的随便放 由于这个题的n的约数非常多,我们可以把它质 ...

  9. snoi 省选模拟赛day2t1 bzoj 2873: 光之大陆

    Description 在光之大陆的土地上,各种势力盘根错节.来自光之峡谷的精灵,来自黑暗森林的亡灵,来自古老东方的人类共同生活在一起.善于打造装置的矮人,善于发明的侏儒,隐匿于山林的巨人也坚守着属于 ...

最新文章

  1. 数据库名、数据库实例、全局数据库名、服务名、SID等的区别
  2. Coursera课程Python for everyone:Quiz: REST, JSON, and APIs
  3. MSSQL 从备份文件还原数据库脚本
  4. Java文件读取 中文乱码
  5. Spark基本操作SparkSession,DatasetRow,JavaRDDRow
  6. 使用API获得SAP CRM Sales Area数据
  7. NumPy 基础用法
  8. 变量的解构赋值(对象)
  9. 因 URL 意外地以“/HelloWorld”结束,请求格式无法识别。
  10. 用Excel做一个案例分析
  11. 超星尔雅学习通情商与智慧人生 答案 满分版
  12. 输出数组元素(c语言)
  13. 惊艳!阿里巴巴最新发布Java系统架构师+开发应用面试突击宝典
  14. Qt在Mac环境下制作dmg安装包
  15. linux内核 print,自定义linux内核调试print
  16. Oracle Primavera Unifier文档管理器(Document Manager)
  17. Go语言学习之打印九九乘法表
  18. API请求获取美句美图等
  19. 端午节蓝屏之谜:金山系列软件同微软KB2839229冲突技术分析
  20. CRF进行实体的识别

热门文章

  1. (int),Int32.Parse() 和 Convert.toInt32() 的区别
  2. fopen 中 按文本读写与按二进制读写 实例
  3. c++ 的重载、覆盖、隐藏
  4. usaco Canada Tour
  5. nginx 转发慢_为啥 Nginx 能轻松淦到几万并发?
  6. mysql多字段数据统计_超详细的mysql元数据sql统计--information_schema
  7. 查询两张表 然后把数据并在一起_工作表数据查询时,类似筛选功能LIKE和NOT LIKE的应用...
  8. pipeline和java的区别_总结:四个Pipeline脚本式与声明式语法差异
  9. mac访问linux桌面文件夹路径,mac下“远程桌面”访问linux
  10. android读取工程目录下的文件,Android编程实现读取工程中的txt文件功能