CF1361D Johnny and James(模拟)
Posted ctyakwf
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CF1361D Johnny and James(模拟)相关的知识,希望对你有一定的参考价值。
因为我要目标值和真实值相同,所以肯定要按目标值大小排序,从小往大排,否则直接就冲突了
之后对于每个节点维护一格mx表示当前周围被填了的mex值,之后对比可以知道是否成功
![技术图片](/img/jia.gif)
#include<bits/stdc++.h> using namespace std; const int N=1e6+10; typedef long long ll; int h[N],ne[N],e[N],idx; int mx[N]; int ans[N]; struct node{ int k,w; }s[N]; void add(int a,int b){ e[idx]=b,ne[idx]=h[a],h[a]=idx++; } bool cmp(node a,node b){ return a.w<b.w; } int main(){ int n,m; cin>>n>>m; memset(h,-1,sizeof h); while(m--){ int a,b; scanf("%d%d",&a,&b); add(a,b); add(b,a); } int i; for(i=1;i<=n;i++){ scanf("%d",&s[i].w); s[i].k=i; } sort(s+1,s+1+n,cmp); int sign=0; for(i=1;i<=n;i++){ int x=s[i].k; int tmp=mx[x]; if(tmp!=s[i].w-1){ cout<<-1<<endl; sign=1; break; } ans[i]=x; for(int j=h[x];j!=-1;j=ne[j]){ int k=e[j]; if(mx[k]==s[i].w-1) mx[k]=s[i].w; } } if(!sign){ for(i=1;i<=n;i++){ printf("%d ",ans[i]); } cout<<endl; } }
以上是关于CF1361D Johnny and James(模拟)的主要内容,如果未能解决你的问题,请参考以下文章
CF-1362B. Johnny and His Hobbies
CF-1362B. Johnny and His Hobbies
CF-1362D. Johnny and Contribution
CF-1362D. Johnny and Contribution