Advertisement
Guest User

Untitled

a guest
Oct 15th, 2012
303
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pascal 1.23 KB | None | 0 0
  1. program Project2;
  2.  
  3. {$APPTYPE CONSOLE}
  4. {$MAXSTACKSIZE 64000000}
  5. uses
  6.   SysUtils;
  7.  
  8. var
  9.   s: int64;
  10.   parent, size: array[-1..20000011] of longint;
  11.   a, b, u, v, du, dv, m, k, i, w, n, z, c, dc: longint;
  12.  
  13. function findRoot(x: longint): longint;
  14. begin
  15.   if parent[x] = x then result:= x else result:= findRoot(parent[x]);
  16. end;
  17.  
  18. procedure makeSet(x: longint);
  19. begin
  20.   parent[x]:= x;
  21.   size[x]:= 1;
  22. end;
  23.  
  24. procedure unionSets(a, b: longint);
  25. begin
  26.   if a <> b then begin
  27.     if size[a] >= size[b] then begin
  28.       parent[b]:= a;
  29.       size[a]:= size[a]+size[b];
  30.     end else begin
  31.       parent[a]:= b;
  32.       size[b]:= size[b]+size[a];
  33.     end;
  34.   end;
  35. end;
  36.  
  37. begin
  38.   reset(input,'dsu.in');
  39.   rewrite(output,'dsu.out');
  40.  
  41.   readln(n, k);
  42.   for i:= 1 to n do begin
  43.     makeSet(i);
  44.   end;
  45.  
  46.   for z:= 1 to k do begin
  47.     readln(u, v, c, du, dv, dc, m);
  48.     for i:= 0 to m-1 do begin
  49.       a:= (n + int64(u+int64(du*i))mod n) mod n;
  50.       b:= (n + int64(v+int64(dv*i))mod n) mod n;
  51.       w:= (1000000000 + (c+int64(dc*i))mod 1000000000) mod 1000000000;
  52.       a:= findROot(a);
  53.       b:= findRoot(b);
  54.       if a <> b then begin
  55.         s:= s + w;
  56.         unionSets(a, b);
  57.       end;
  58.     end;
  59.   end;
  60.  
  61.   writeln(s);
  62. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement