拓扑排序TLE求助
查看原帖
拓扑排序TLE求助
141368
May_wind楼主2022/8/25 21:33

RT,显示TLE on #test 10

#include<iostream>
#include<cstdio>
#include<queue>

using namespace std;

typedef long long ll;
const int N = 2e5+10;
template <typename QwQ>
void read(QwQ &mitsuha){
	mitsuha = 0;bool taki = true;
	char ch = getchar();
	while(ch < '0' || ch > '9'){
        if(ch == '-')taki = false;
        ch = getchar();
	}
	while(ch >= '0' && ch <= '9'){
		mitsuha = (mitsuha << 3) + (mitsuha << 1) + (ch ^ 48);
		ch = getchar();
	}
}
struct Edge{
	int to,ne;
}e[N << 1];
int n,m,h[N],idx,st[N],top;
ll k,a[N],d[N],f[N];
bool flag = true,vis[N];
void add(int u,int v){
	e[++ idx] = (Edge){v,h[u]};
	h[u] = idx;
}
bool check(ll mid){
	for(int i = 1 ; i <= n ; i ++ )d[i] = f[i] = 0,vis[i] = false;
	for(int i = 1 ; i <= n ; i ++){
		if(a[i] > mid)continue;
		for(int j = h[i] ; j ; j = e[j].ne){
			int v = e[j].to;
			if(a[v] > mid)continue;
			d[v] ++;
		}
	}
	for(int i = 1 ; i <= n ; i ++){
		if(a[i] > mid)continue;
		if(d[i] == 0)st[++ top] = i,f[i] = 1,vis[i] = true;
	}
	while(top){
		for(int i = 1 ; i <= top ; i ++){
			int u = st[i];
			for(int j = h[u] ; j ; j = e[j].ne){
				int v = e[j].to;
				if(a[v] > mid)continue;
				d[v] --;f[v] = max(f[u] + 1,f[v]);
			}
		}
		top = 0;
		for(int i = 1 ; i <= n ; i ++){
			if(a[i] > mid)continue;
			if(d[i] == 0 && (!vis[i])){
			st[++ top] = i,vis[i] = true;}
		}
	}
	for(int i = 1 ; i <= n ; i ++)
		if(a[i] <= mid && (!vis[i])){
			flag = false;return true;
		}
	ll ans = 0;
	for(int i = 1 ; i <= n ; i ++)ans = max(ans,f[i]);
	if(ans >= k){
		flag = false;return true;
	}
	return false;
}
int main(){
	read(n);read(m);read(k);
	ll minn = 1e18,maxn = -0x7fffffff;
	for(int i = 1 ; i <= n ; i ++){
		read(a[i]);
		maxn = max(a[i],maxn);
		minn = min(a[i],minn); 
	}
	for(int i = 1 ; i <= m ; i ++){
		int u,v;
		read(u);read(v);
		add(u,v);
	}
	ll l = minn,r = maxn,ans = -1;
	while(l <= r){
		ll mid = (l + r) >> 1;
		if(check(mid)){
			ans = mid;
			r = mid - 1;
		}
		else l = mid + 1;
	}
	printf("%lld",ans);
	return 0;
}
2022/8/25 21:33
加载中...