90pts WA on #14 # 6
查看原帖
90pts WA on #14 # 6
126972
Kevinx楼主2023/11/1 17:19

90记录

感觉是缩点写错了

// 缩点 + TP 
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll N = 5e5 + 20;
ll n, m, k[N], maxx1 = 0, maxx2 = 0;
ll dfn[N], low[N], cnt = 0;
ll tot = 0, val[N], C[N], in[N], Max[N], TR[N], f[N];
stack<ll> S;
queue<ll> q;
bool vis[N];
vector<ll> G[N], New[N];
void add_edge(ll u, ll v) {
	G[u].push_back(v);
}
void Tarjan(ll u) {
	dfn[u] = low[u] = ++cnt;
	S.push(u);
	for(int i = 0; i < G[u].size(); i++) {
		ll v = G[u][i];
		if(!dfn[v]) {
			Tarjan(v);
			low[u] = min(low[u], low[v]);
		}
		else if(!C[v])  low[u] = min(low[u], dfn[v]);
		
	}
	if(low[u] == dfn[u]) {
		ll maxx = 0; 
		++tot;
		while(!S.empty() && S.top() != u) maxx = max(maxx, k[S.top()]), val[tot] += k[S.top()], C[S.top()] = tot, S.pop();
		C[S.top()] = tot;
		Max[tot] = max(maxx, k[S.top()]);
		TR[tot] = Max[tot];
		val[tot] += k[S.top()];
		S.pop();
	}
}
void PR() {
	for(int i = 1; i <= tot; i++) {
		for(int j = 0; j < New[i].size(); j++) {
			cout << i << " " << New[i][j] << endl;
		}
	} 
} 
int main (){
	scanf("%lld%lld", &n, &m);
	for(int i = 1; i <= n; i++) scanf("%lld", &k[i]);
	for(int i = 1; i <= m; i++) {
		ll u, v;
		scanf("%lld%lld", &u, &v);
		add_edge(u, v);
		in[v]++;
	}
	for(int i = 1; i <= n; i++) if(!dfn[i] && in[i] == 0) Tarjan(i);
	memset(in, 0, sizeof(in));
	for(int i = 1; i <= n; i++) {
		ll u = i;
		for(int j = 0; j < G[u].size(); j++) {
			ll v = G[u][j];
			if(C[u] != C[v]) {
//				cout << C[u] << " " << C[v] << " " << val[C[u]] << " " << val[C[v]] << endl;
				
				New[C[u]].push_back(C[v]);
				in[C[v]] ++;
			}
		}
	}
	
	for(int i = 1; i <= tot; i++) {
	if(in[i] == 0) q.push(i);
//	if(in[i] == 0) cout << i << endl;
	}
//	cout << in[3];
//PR();
	while(!q.empty()) {
		ll u = q.front();
		f[u] = max(f[u], val[u]);
//	    cout << u << endl;

		q.pop();
		for(int i = 0; i < New[u].size(); i++) {
			ll v = New[u][i];
			f[v] = max(f[v], val[v]);
			if(f[u] + val[v] >= f[v]) Max[v] = f[u] + val[v] > f[v] ? max(Max[u], TR[v]) : max(Max[v], Max[u]) , f[v] = f[u] + val[v];
			if(f[v] >= maxx1) maxx2 = f[v] > maxx1 ? Max[v] : max(maxx2, Max[v]), maxx1 = f[v];
			--in[v];
			if(in[v] == 0) q.push(v);
		}
	}
	printf("%lld %lld", maxx1, maxx2);
	
	return 0;
}
/*
6 6
1000 3 2 2 1 999
3 1
4 2
3 2
4 1
1 5
2 6

1004 999
*/
2023/11/1 17:19
加载中...