标签:str 带权并查集 stream output together ram cal should turn
InputLine 1: Two integers, N and M (1 <= N <= 200000, 1 <= M <= 40000). Means TT wrote N integers and FF asked her M questions.
Line 2..M+1: Line i+1 contains three integer: Ai, Bi and Si. Means TT answered FF that the sum from Ai to Bi is Si. It‘s guaranteed that 0 < Ai <= Bi <= N.
You can assume that any sum of subsequence is fit in 32-bit integer.
OutputA single line with a integer denotes how many answers are wrong.Sample Input
10 5 1 10 100 7 10 28 1 3 32 4 6 41 6 6 1
Sample Output
1
很简单的带权并查集,将闭区间[l,r]改为半开区间(l-1,r],进行区间操作
var rep,sum:array[0..200000]of longint; n,m,a,i,b,c,ans,l,r:longint; function getrep(x:longint):longint; var fa:longint; begin if(x=rep[x])then begin exit(x); end; fa:=rep[x]; rep[x]:=getrep(rep[x]); sum[x]:=sum[x]+sum[fa]; exit(rep[x]); end; begin while(not eof) do begin readln(n,m); ans:=0; for i:=0 to n do begin rep[i]:=i; sum[i]:=0; end; for i:=1 to m do begin readln(a,b,c); dec(a); if(getrep(a)=getrep(b)) then begin if(sum[b]-sum[a]<>c) then inc(ans); end else begin l:=getrep(a);r:=getrep(b); rep[r]:=l; sum[r]:=sum[a]+c-sum[b]; end; end; writeln(ans); end; end.
c++的
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> using namespace std; #define N 200000+10 int rep[N],sum[N]; int getrep(int x) { if(rep[x]==x) return x; int f=rep[x]; rep[x]=getrep(rep[x]); sum[x]+=sum[f]; return rep[x]; } int main() { int n,m; while(~scanf("%d%d",&n,&m)) { int ans=0; //cin>>n>>m; for(int i=0;i<=n;i++) rep[i]=i,sum[i]=0; for(int i=1;i<=m;i++) { int l,r,s; scanf("%d%d%d",&l,&r,&s); l--; int L=getrep(l),R=getrep(r); if(L==R) { if(sum[l]-sum[r]!=s)ans++; }else { rep[L]=R; sum[L]=sum[r]-sum[l]+s; } } cout<<ans<<endl; } }
标签:str 带权并查集 stream output together ram cal should turn
原文地址:http://www.cnblogs.com/dancer16/p/6917894.html