WA on #18 #23
查看原帖
WA on #18 #23
307542
yyyhy楼主2024/11/8 13:27
#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];
int nowmin[maxn + 10], nowmax[maxn + 10];

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

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), nowmin[i] = inf;
    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);
		nowmin[i] = vmin[i], nowmax[i] = vmax[i] - vmin[i];
	}
	while (!Q.empty()) {
		int now = Q.front(); Q.pop();
		for (int i : newS[now]) {
			hav[i] |= hav[now];
			goin[i]--;
			if (hav[now]) {
				nowmin[i] = std :: min(nowmin[i], nowmin[now]);
				nowmax[i] = std :: max(std :: max(nowmax[i], nowmax[now]), vmax[i] - nowmin[i]);
			}
			if (!goin[i]) Q.push(i);
		}
	}
	
	printf("%d\n", hav[wh[n]] * nowmax[wh[n]]);
    
    return 0;
}

思路就是缩点+dp

2024/11/8 13:27
加载中...