Codeforces Round #628 (Div.2) C.Ehab and Path-etic MEXs(树,思维)

Jewel ·
更新时间:2024-09-20
· 879 次阅读

传送门

题意:

给一颗n个结点的数,然后n-1条边,我们要做的就是把0—n-2,这n-1个数赋给n-1条边,然后使得所有MEX(u,v)最大值最小,输出每条边赋的值
MEX(u,v)是u到v这条路径上,没出现的最小非负整数
例如:
在这里插入图片描述
括号里写的是他的路径
MEX(3,6)=2(3,0,4,1)2是最小的在路径中没出现的非负整数
MEX(4,6)=0(2,4,1)0是最小的在路径中没出现的非负整数

思路:

如果是一条链,随便给值即可
如果不是一条链,那肯定有个结点的度大于等于3,把这个结点周围的三条边分别给值0,1,2,这样所有MEX(u,v)最大值为2,因为不可能有一条边同时经过0,1,2这三条边,其他的边就随便给值即可

代码: #include #include #include #include #include #include #include #include #include #include #define pb push_back #define lb lower_bound #define ub upper_bound #define rep(i,a,b) for(int i=a;i=b;i--) typedef long long ll; using namespace std; const int MAXN=1e5+50; const int inf=0x3f3f3f3f; const int M=5000*4; int a[MAXN];//每个点的度 int ans[MAXN]; struct sa{ int x,y; }p[MAXN]; int main() { std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0); int n; cin>>n; int pos=-1; rep(i,1,n-1){ int u,v; cin>>u>>v; p[i].x=u; p[i].y=v; a[u]++; a[v]++; if(a[u]>=3){ pos=u; } if(a[v]>=3){ pos=v; } } if(pos==-1){ for(int i=0;i<=n-2;i++)cout<<i<<endl; } else{ int cnt=0; for(int i=1;i<=n-1;i++)ans[i]=-1; //pos为度大于等于3的点,找跟他相连的边赋值0,1,2即可 for(int i=1;i<=n-1;i++){ if(p[i].x==pos||p[i].y==pos){ ans[i]=cnt; cnt++; } if(cnt==3)break; } cnt=3; for(int i=1;i<=n-1;i++){ if(ans[i]==-1){ cout<<cnt<<endl; cnt++; } else cout<<ans[i]<<endl; } } return 0; } /* */ summery

又tmd的一直读不懂题,我真sb


作者:_Alexander



path CodeForces AND round div

需要 登录 后方可回复, 如果你还没有账号请 注册新账号