【JZOJ5051】平行宇宙 题解
来源:互联网 发布:plc网络传输器弊端 编辑:程序博客网 时间:2024/06/08 07:30
题目大意
题解
代码
#include<cstdio>#include<algorithm>#define fo(i,a,b) for(int i=a;i<=b;i++)#define fd(i,a,b) for(int i=a;i>=b;i--)using namespace std;const int maxn=5e5+5;int n,K,ans;int tot,go[maxn],next[maxn],f1[maxn],fa[maxn];void ins(int x,int y){ go[++tot]=y; next[tot]=f1[x]; f1[x]=tot;}int d[maxn],com[maxn];bool roll[maxn];void topo(){ int j=0; fo(i,1,n) if (!com[i]) d[++j]=i; for(int i=1; i<=j; i++) { if (--com[fa[d[i]]]==0) d[++j]=fa[d[i]]; } fo(i,1,n) if (com[i]) roll[i]=1;}int tim[maxn];bool bz[maxn];void dfs(int k){ bz[k]=1; tim[k]=K+500; for(int p=f1[k]; p; p=next[p]) { dfs(go[p]); tim[k]=min(tim[k],tim[go[p]]+1); } if (k==1) tim[k]=0; else if (tim[k]>K && !roll[k]) { tim[k]=1; ans++; }}int ga[2*maxn],stp[2*maxn];int get(int x){ if (ga[x]==x) return x; int t=ga[x]; ga[x]=get(ga[x]); stp[x]+=stp[t]; return ga[x];}int c0,c[2*maxn],f[2*maxn]; // f 就是上面说的 nextvoid calc(int x){ c[c0=1]=x; for(int i=fa[x]; i!=x; i=fa[i]) c[++c0]=i; fo(i,1,c0) c[c0+i]=c[i]; fo(i,1,c0) dfs(c[i]); fo(i,1,2*c0) tim[c[i]]=min(tim[c[i]],tim[c[i-1]]+1); fo(i,1,2*c0) ga[i]=i, stp[i]=0; fd(i,2*c0,2*c0-K+1) f[i]=2*c0+1; int last=2*c0+1; fd(i,2*c0,K+1) { if (tim[c[i]]>K) last=i; f[i-K]=last; } int nmin=n+500; fo(i,1,c0) if (tim[c[i]]>K) { int ans1=0, last=0; for(int j=i; j && j-i+1<=c0; j=f[j]) { int t2=get(j); ans1+=1+stp[j]; if (last) { int t1=get(last); ga[t1]=t2; stp[t1]+=stp[j]+1; } j=t2; last=j; } nmin=min(nmin,ans1); } ans+=(nmin==n+500) ?0 :nmin ;}int main(){ scanf("%d %d",&n,&K); fo(i,1,n) { int x,y; scanf("%d %d",&x,&y); fa[x]=y; com[y]++; } topo(); fo(i,1,n) if (!roll[i]) ins(fa[i],i); fo(i,1,n) if (roll[i] && !bz[i]) calc(i); printf("%d\n",ans);}
0 0
- 【JZOJ5051】平行宇宙 题解
- {题解}[jzoj5051]【GDOI2017模拟一试4.11】平行宇宙
- jzoj5051 【GDOI2017模拟一试4.11】平行宇宙 [贪心,并查集]
- 看“平行宇宙”有感
- 如何理解平行宇宙?
- 信息系统和平行宇宙
- 平行宇宙 & 五度时空
- 如何偷窥平行宇宙文明
- 平行宇宙中的一滴水
- 关于MWI平行宇宙数的探讨
- “看不见”的物质来自平行宇宙?
- 平行理论引发多宇宙论 宇宙外还有另一宇宙
- [宇宙与天文]平行宇宙与时空转移
- luoguP1781 宇宙总统 题解
- 平行宇宙在统一时间T中迷失谭
- 平行宇宙的追逐--异步FIFO控制器的设计。
- 【题解】【欧拉图】罪世界-平行齿轮
- 《超越时空:通过平行宇宙、时间卷曲和第十维度的科学之旅》读书笔记
- Leetcode 112. Path Sum
- ubuntu linux设置静态ip的方法
- Java面向对象笔记(十四)内部类
- ZOJ3770Ranking System
- linux下tar、zip等压缩、解压命令
- 【JZOJ5051】平行宇宙 题解
- 在阿里云服务器Ubuntu14.04 64位上安装matlab2014a
- CSS外部样式示例
- 0-1背包(空间优化)
- 【java】使用一维数组实现评委打分功能
- 检索(散列)
- Reorder List and Sum of Left Leaves
- Kubernetes使用Harbor仓库
- POJ 1039 Pipe(直线和线段相交判断,求交点)