1202: [HNOI2005]狡猾的商人
阿新 • • 發佈:2018-09-22
一段時間 盈利 mst class 信息 href ios stat 並查集 Time Limit: 10 Sec Memory Limit: 162 MB
Submit: 4792 Solved: 2376
[Submit][Status][Discuss]
3 3
1 2 10
1 3 -5
3 3 -15
5 3
1 5 100
3 5 50
1 2 51
false 第一次寫帶權並查集
Submit: 4792 Solved: 2376
[Submit][Status][Discuss]
Description
刁姹接到一個任務,為稅務部門調查一位商人的賬本,看看賬本是不是偽造的。賬本上記錄了n個月以來的收入情況,其中第i 個月的收入額為Ai(i=1,2,3...n-1,n), 。當 Ai大於0時表示這個月盈利Ai 元,當 Ai小於0時表示這個月虧損Ai 元。所謂一段時間內的總收入,就是這段時間內每個月的收入額的總和。 刁姹的任務是秘密進行的,為了調查商人的賬本,她只好跑到商人那裏打工。她趁商人不在時去偷看賬本,可是她無法將賬本偷出來,每次偷看賬本時她都只能看某段時間內賬本上記錄的收入情況,並且她只能記住這段時間內的總收入。 現在,刁姹總共偷看了m次賬本,當然也就記住了m段時間內的總收入,你的任務是根據記住的這些信息來判斷賬本是不是假的。
Input
第一行為一個正整數w,其中w < 100,表示有w組數據,即w個賬本,需要你判斷。每組數據的第一行為兩個正整數n和m,其中n < 100,m < 1000,分別表示對應的賬本記錄了多少個月的收入情況以及偷看了多少次賬本。接下來的m行表示刁姹偷看m次賬本後記住的m條信息,每條信息占一行,有三個整數s,t和v,表示從第s個月到第t個月(包含第t個月)的總收入為v,這裏假設s總是小於等於t。
Output
包含w行,每行是true或false,其中第i行為true當且僅當第i組數據,即第i個賬本不是假的;第i行為false當且僅當第i組數據,即第i個賬本是假的。
Sample Input
23 3
1 2 10
1 3 -5
3 3 -15
5 3
1 5 100
3 5 50
1 2 51
Sample Output
truefalse 第一次寫帶權並查集
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 usingnamespace std; 5 6 int w; 7 int f[105],sum[105]; 8 bool flag; 9 10 int find(int x) 11 { 12 if(f[x]==x) return x; 13 int root=find(f[x]); 14 sum[x]+=sum[f[x]]; 15 return f[x]=root; 16 } 17 18 int main() 19 { 20 scanf("%d",&w); 21 while(w--) 22 { 23 int n,m; 24 scanf("%d%d",&n,&m); 25 memset(sum,0,sizeof(sum)); 26 flag=0; 27 for(int i=0;i<=n;i++) f[i]=i; 28 for(int i=1;i<=m;i++) 29 { 30 int x,y,z; 31 scanf("%d%d%d",&x,&y,&z); 32 x--; 33 int u=find(x),v=find(y); 34 if(u!=v) 35 { 36 f[v]=u; 37 sum[v]=sum[x]-sum[y]+z; 38 }else if(sum[y]-sum[x]!=z) flag=1; 39 } 40 if(flag) printf("false\n"); 41 else printf("true\n"); 42 } 43 return 0; 44 }
以後來補一個差分約束
1202: [HNOI2005]狡猾的商人