P8779题解
前置知识:P1196 和 ABC238E。不知道为什么两个绿题缝合起来变成黄题了。
首先考虑怎么判断无解的情况。见这篇题解
观察到原数组的具体取值并不重要,我们需要的只是区间
于是不难想到一个思路:对于给定的一个区间
于是我们已知
但是现在我们除了知道是否连通之外还需要知道具体的区间和,于是考虑在并查集上维护一个
时间复杂度
双倍经验:hdu3038,思路基本是一致的。
代码:
#import <bits/stdc++.h>
using namespace std;
#define int long long
const int maxn=200000+10;
int n,m,a,b,s;
int par[maxn],val[maxn];
void init(int l,int r)
{
for(int i=l;i<=r;i++)
par[i]=i,val[i]=0;
}
int find(int x)
{
if(par[x]==x)
return x;
else
{
int root=find(par[x]);
val[x]+=val[par[x]];
return
par[x]=root;
}
}
signed main()
{
cin>>n>>m;
int q;
cin>>q;
init(0,n);
int ans=0;
for(int i=1,a,b,s;i<=m;i++)
{
scanf("%lld%lld%lld",&a,&b,&s);
a--;
int t1=find(a),t2=find(b);
if(t1!=t2)
{
par[t2]=t1;
val[t2]=-val[b]+s+val[a];
}
}
while(q--)
{
scanf("%d%d",&a,&b);
a--;
int t1=find(a),t2=find(b);
if(t1!=t2)
cout<<"UNKNOWN\n";
else
cout<<val[b]-val[a]<<'\n';
}
}