题解-Quantifier Question

Quantifier Question

有长度为 \(n\) 的序列 \(x\{n\}\),需要满足 \(m\) 个条件...

这篇文章还没有写完!不要D蒟蒻KonnyWen!

#include <bits/stdc++.h>
using namespace std;

//Start
typedef long long ll;
typedef double db;
#define mp(a,b) make_pair(a,b)
#define x(a) a.first
#define y(a) a.second
#define b(a) a.begin()
#define e(a) a.end()
#define sz(a) int((a).size())
#define pb(a) push_back(a)
const int inf=0x3f3f3f3f;
const ll INF=0x3f3f3f3f3f3f3f3f;

//Data
const int N=2e5;
int n,m,d[N+7],f[N+7],b[N+7],sm,ans[N+7];
vector<int> e[N+7],g[N+7];

//Bfs
int Bfs(vector<int>&q){
	q.clear();
	for(int i=1;i<=n;i++)if(!d[i]) q.pb(i);
	for(int i=0;i<sz(q);i++)
		for(int to:e[q[i]])if(!--d[to]) q.pb(to);
	return sz(q)==n;
}

//Main
int main(){
	scanf("%d%d",&n,&m);
	for(int i=1,u,v;i<=m;i++) scanf("%d%d",&u,&v),e[u].pb(v),g[v].pb(u);
	for(int i=1;i<=n;i++) d[i]=sz(g[i]);
	vector<int> tp;
	if(!Bfs(tp)) return puts("-1"),0;
	iota(f+1,f+n+1,1),iota(b+1,b+n+1,1);
	for(int i=0;i<=sz(tp)-1;i++)
		for(int to:g[tp[i]]) f[tp[i]]=min(f[tp[i]],f[to]);
	for(int i=sz(tp)-1;i>=0;i--)
		for(int to:e[tp[i]]) b[tp[i]]=min(b[tp[i]],b[to]);
	for(int i=1;i<=n;i++)if(min(f[i],b[i])==i) sm++,ans[i]=1;
	printf("%d\n",sm);
	for(int i=1;i<=n;i++) putchar("EA"[ans[i]]);puts("");
	return 0;
}
上一篇:Java中ThreadLocal的实际用途是啥?


下一篇:0基础入门预训练的词向量