题解:P14624 [2018 KAIST RUN Fall] Dumae
P14624 [2018 KAIST RUN Fall] Dumae 题解
题目传送门
题意描述
有
若存在合法的方案,则给出任意一种;若不存在,输出
思路
一道拓扑+贪心题。我们先进行拓扑排序(无解输出
::::info[code]{open}
#include <bits/stdc++.h>
#define pairr pair<int,int>
using namespace std;
inline int read(){
int res=0,f=1;char ch=getchar();
for(;ch>57||ch<48;ch=getchar())if(ch=='-')f=-1;
for(;ch>47&&ch<58;ch=getchar())res=(res<<3)+(res<<1)+(ch^48);
return res*f;
}
inline int Min(int a,int v){return a<v?a:v;}
inline int Max(int a,int v){return a>v?a:v;}
int n,m,f,cnt,p;
int l[300005],r[300005],to[300005],in[300005];
vector<int>g[300005],ans;
vector<pairr>a[300005];
signed main(){
n=read(),m=read();
for(int i=1;i<=n;i++){
l[i]=read(),r[i]=read();
}
for(int i=1;i<=m;i++){
int u=read(),v=read();
g[u].push_back(v);
in[v]++;
}
queue<int>q;
for(int i=1;i<=n;i++)if(!in[i])q.push(i),cnt++;
while(!q.empty()){
int u=q.front();
to[++p]=u;
q.pop();
for(int i=0;i<g[u].size();i++){
in[g[u][i]]--;
if(!in[g[u][i]])q.push(g[u][i]),cnt++;
}
}
if(cnt!=n){
cout<<-1;
return 0;
}
for(int i=1;i<=n;i++){
int u=to[i];
for(int j=0;j<g[u].size();j++){
int v=g[u][j];
l[v]=Max(l[v],l[u]+1);
}
}
reverse(to+1,to+1+n);
for(int i=1;i<=n;i++){
int u=to[i];
for(int j=0;j<g[u].size();j++){
int v=g[u][j];
r[u]=Min(r[u],r[v]-1);
}
}
for(int i=1;i<=n;i++){
if(l[i]>r[i]){
cout<<-1;
return 0;
}
}
priority_queue<pairr,vector<pairr>,greater<pairr> >rq;
for(int i=1;i<=n;i++)a[l[i]].push_back(pairr(r[i],i));
for(int i=1;i<=n;i++){
for(int j=0;j<a[i].size();j++)rq.push(a[i][j]);
if(rq.empty()){
cout<<-1;
return 0;
}
if(rq.top().first<i){
cout<<-1;
return 0;
}
int u=rq.top().second;
rq.pop();
ans.push_back(u);
}
for(int i=0;i<n;i++)cout<<ans[i]<<'\n';
return 0;
}
::::