极其抽象
查看原帖
极其抽象
307542
yyyhy楼主2024/11/7 20:36

rt,考场杀手

为什么呜呜

#include <cstdio>
#include <vector>
#include <queue>
#include <algorithm>
#define maxn 100000
#define inf 210000000

std :: queue <int> Q;
std :: vector <int> S[maxn + 10];
std :: vector <int> newS[maxn + 10];
int vmax[maxn + 10], vmin[maxn + 10];
int goin[maxn + 10], hav[maxn + 10], nowmin = inf;

int n, m, v[maxn + 10], x, y, z, ans;

int stac[maxn + 10], h, nowlen; 
int timer, wh[maxn + 10], dfn[maxn + 10], low[maxn + 10], vis[maxn + 10];

inline void dfs(int i) {
	stac[++h] = i;
	dfn[i] = low[i] = ++timer;
	vis[i] = 1;
	for (int now : S[i])
		if (vis[now]) low[i] = std :: min(low[i], low[now]);
		else dfs(now), low[i] = std :: min(low[i], low[now]);
	if (low[i] != dfn[i]) return;
	nowlen++;
	vmin[nowlen] = inf, vmax[nowlen] = -inf;
	while (stac[h] != i) {
		wh[stac[h]] = nowlen;
		vmin[nowlen] = std :: min(vmin[nowlen], v[stac[h]]);
		vmax[nowlen] = std :: max(vmax[nowlen], v[stac[h]]);
		h--;
	}
	vmin[nowlen] = std :: min(vmin[nowlen], v[stac[h]]);
	vmax[nowlen] = std :: max(vmax[nowlen], v[stac[h]]);
	wh[stac[h--]] = nowlen;
	
	return;
}

int main(void) {
	//freopen("in.in", "r", stdin);
    scanf("%d %d", &n, &m);
    for (int i = 1; i <= n; i++)
    	scanf("%d", v + i);
    while (m--) {
    	scanf("%d %d %d", &x, &y, &z);
    	if (z == 1) {
    		S[x].push_back(y);
		} else {
			S[x].push_back(y);
			S[y].push_back(x);
		}
	}
	for (int i = 1; i <= n; i++)
		if (!wh[i]) dfs(i);
	for (int i = 1; i <= n; i++)
		for (int j : S[i])
			if (wh[i] != wh[j])
				newS[wh[i]].push_back(wh[j]), goin[wh[j]]++;
	hav[wh[1]] = 1;
	for (int i = 1; i <= nowlen; i++)
		if (!goin[i]) Q.push(i);
	while (!Q.empty()) {
		int now = Q.front(); Q.pop();
		if (hav[now]) {
			nowmin = std :: min(nowmin, vmin[now]);
			ans = std :: max(ans, vmax[now] - nowmin);
		}
		for (int i : newS[now]) {
			hav[i] |= hav[now];
			goin[i]--;
			if (!goin[i]) Q.push(i);
		}
	}
	
	printf("%d\n", ans);
    
    return 0;
}
2024/11/7 20:36
加载中...