WA100求调
查看原帖
WA100求调
759525
Tomotake楼主2024/11/22 23:48
#include <bits/stdc++.h>
#define int long long
#define pb push_back
#define erep(i, u) for(int i=h[u];~i;i=ne[i])
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define dep(i,a,b) for(int i=a;i>=b;i--)
using namespace std;

#define getchar() p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<20,stdin),p1==p2)?EOF:*p1++
namespace FIO{static char buf[1<<20],*p1=buf,*p2=buf;inline int rd(){int x=0,f=1;char c=getchar();while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}while(c>='0'&&c<='9')x=(x<<3)+(x<<1)+(c^48),c=getchar();return x*f;}inline void write(int x){if(x<0)putchar('-'),x=-x;if(x>9)write(x/10);putchar(x%10+'0');}inline void pt(int x){if(!x)putchar('0');else{int s[20],t;for(t=0;x;x/=10)s[t++]=x%10;while(t)putchar(s[--t]^48);}putchar('\n');}}using namespace FIO;

namespace zty
{
	const int N = 200010, M = 1000010;
	
	bool m1;
	int n, m, w[N];
	int dfn[N], low[N], scc[N], cnt, scnt, stk[N], in[N], top, mx[N], mn[N];
	int h[N], e[M], ne[M], idx;
	int ind[N], dp[N], tot;
	pair<int, int> edge[M];
	bool m2;
	
	void add(int a, int b)
	{
		e[idx] = b, ne[idx] = h[a], h[a] = idx ++;
	}
	
	void tarjan(int u)
	{
		dfn[u] = low[u] = ++ cnt;
		in[u] = 1, stk[++ top] = u;
		erep(i, u)
		{
			int v = e[i];
			if (!dfn[v]) tarjan(v), low[u] = min(low[u], low[v]);
			else if (in[v]) low[u] = min(low[u], dfn[v]);
		}
		if (low[u] == dfn[u])
		{
			scnt ++;
			int f;
			do
			{
				f = stk[top --];
				scc[f] = scnt, in[f] = 0;
				mx[scnt] = max(mx[scnt], w[f]), mn[scnt] = min(mn[scnt], w[f]);
			}while (u != f);
		}
	}
	
	void topsort()
	{
		queue<int> q;
		q.push(scc[1]);
		while (q.size())
		{
			int u = q.front();q.pop();
			erep(i, u)
			{
				int v = e[i];
				dp[v] = max(dp[v], dp[u]);
				mn[v] = min(mn[v], mn[u]);
				dp[v] = max(dp[v], mx[v] - mn[v]);
				ind[v] --;
				if (!ind[v]) q.push(v);
			}
		}
	}
	
	signed main()
	{
		ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
	    //cout << fixed << setprecision(3) << (&m2 - &m1) / 1024.0 / 1024 << endl;
	    memset(h, -1, sizeof h), memset(mx, 0xff, sizeof mx), memset(mn, 0x3f, sizeof mn);
		n = rd(), m = rd();
		rep(i, 1, n) w[i] = rd();
 		rep(i, 1, m)
		{
			int a = rd(), b = rd(), op = rd();
			add(a, b);
			edge[++ tot] = {a, b};
			if (op == 2) add(b, a), edge[++ tot] = {b, a};
		}
		tarjan(1);
		memset(e, 0, sizeof e), memset(ne, 0, sizeof ne), memset(h, -1, sizeof h), idx = 0;
		rep(i, 1, tot)
		{
			int u = edge[i].first, v = edge[i].second;
			if (scc[u] != scc[v] && dfn[u] && dfn[v])
				add(scc[u], scc[v]), ind[scc[v]] ++;
		}
		//rep(i, 1, n) cout << scc[i] << " "; cout << endl;
		topsort();
		cout << dp[scc[n]] << endl;
		return 0;
	}
}

signed main()
{
	//freopen(".in", "r", stdin), freopen(".out", "w", stdout);freopen("P1073_4.in", "r", stdin);
    zty::main();
}

有几个hack数据输出的都是0,不知道为什么

2024/11/22 23:48
加载中...