Advertisement
Guest User

J - A lot of time (DSU)

a guest
Jun 23rd, 2015
438
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 5.10 KB | None | 0 0
  1. import java.io.*;
  2. import java.util.*;
  3.  
  4. public class J_DSU {
  5.  
  6.     final boolean ONLINE_JUDGE = true;
  7.     BufferedReader in;
  8.     PrintWriter out;
  9.     StringTokenizer tok = new StringTokenizer("");
  10.  
  11.     void solve() throws IOException {
  12.         int t = 1;
  13.         while (t-- > 0) {
  14.             solveTest();
  15.         }
  16.     }
  17.  
  18.  
  19.     class Gamer implements Comparable<Gamer> {
  20.         int time;
  21.         int index;
  22.         List<Gamer> friends;
  23.  
  24.         public Gamer(int time, int index) {
  25.             this.time = time;
  26.             this.index = index;
  27.             friends = new ArrayList<Gamer>();
  28.         }
  29.  
  30.         public int compareTo(Gamer other) {
  31.             return Integer.compare(this.time, other.time);
  32.         }
  33.  
  34.         public void addFriend(Gamer gamer) {
  35.             friends.add(gamer);
  36.         }
  37.     }
  38.  
  39.     class DSU {
  40.         int n;
  41.         int[] p;
  42.         int[] size;
  43.  
  44.         DSU(int n) {
  45.             this.n = n;
  46.             p = new int[n];
  47.             size = new int[n];
  48.             for (int i = 0; i < n; i++) {
  49.                 p[i] = i;
  50.                 size[i] = 1;
  51.             }
  52.         }
  53.  
  54.         int getParent(int v) {
  55.             if(p[v] == v) return v;
  56.             return p[v] = getParent(p[v]);
  57.         }
  58.  
  59.         void merge(int a, int b) {
  60.             a = getParent(a);
  61.             b = getParent(b);
  62.             if(a == b) return;
  63.             if(size[a] > size[b]) {
  64.                 p[b] = a;
  65.                 size[a] += size[b];
  66.             } else {
  67.                 p[a] = b;
  68.                 size[b] += size[a];
  69.             }
  70.         }
  71.  
  72.         int getSize(int v) {
  73.             v = getParent(v);
  74.             return size[v];
  75.         }
  76.     }
  77.  
  78.     private void solveTest() throws IOException {
  79.         int n = readInt();
  80.         int m = readInt();
  81.         int p = readInt();
  82.         Gamer[] gamers = new Gamer[n];
  83.         gamers[0] = new Gamer(Integer.MAX_VALUE, 0);
  84.         for (int i = 1; i < n; i++) {
  85.             gamers[i] = new Gamer(readInt(), i);
  86.         }
  87.         int[] g = new int[p];
  88.         int[] max = new int[p];
  89.         for (int i = 0; i < p; i++) {
  90.             g[i] = readInt();
  91.             if (i == 0 || max[i - 1] < g[i]) {
  92.                 max[i] = g[i];
  93.             } else {
  94.                 max[i] = max[i - 1];
  95.             }
  96.         }
  97.         for (int i = 0; i < m; i++) {
  98.             int from = readInt()-1;
  99.             int to = readInt()-1;
  100.             gamers[from].addFriend(gamers[to]);
  101.             gamers[to].addFriend(gamers[from]);
  102.         }
  103.  
  104.         Arrays.sort(gamers);
  105.         DSU dsu = new DSU(n);
  106.         long[] res = new long[p];
  107.         int gamerPointer = n-1;
  108.         boolean[] used = new boolean[n];
  109.  
  110.         for(int i = p-1; i >= 0; i--) {
  111.             while (gamerPointer >= 0) {
  112.                 if(gamers[gamerPointer].time < max[i]) {
  113.                     break;
  114.                 }
  115.                 Gamer curGamer = gamers[gamerPointer];
  116.                 used[curGamer.index] = true;
  117.                 for(Gamer friend: curGamer.friends) {
  118.                     if(used[friend.index]) {
  119.                         dsu.merge(curGamer.index, friend.index);
  120.                     }
  121.                 }
  122.                 gamerPointer--;
  123.             }
  124.  
  125.             int curSize = dsu.getSize(0);
  126.             res[i] = curSize * 1l * g[i];
  127.         }
  128.         for(int i = 0; i < p; i++) {
  129.             out.print(res[i] + " ");
  130.         }
  131.     }
  132.  
  133.     void init() throws FileNotFoundException {
  134.         if (ONLINE_JUDGE) {
  135.             in = new BufferedReader(new InputStreamReader(System.in));
  136.             out = new PrintWriter(System.out);
  137.         } else {
  138.             in = new BufferedReader(new FileReader("input.txt"));
  139.             out = new PrintWriter("output.txt");
  140.         }
  141.     }
  142.  
  143.     String readString() throws IOException {
  144.         while (!tok.hasMoreTokens()) {
  145.             tok = new StringTokenizer(in.readLine(), " .");
  146.         }
  147.         return tok.nextToken();
  148.     }
  149.  
  150.     int readInt() throws IOException {
  151.         return Integer.parseInt(readString());
  152.     }
  153.  
  154.     long readLong() throws IOException {
  155.         return Long.parseLong(readString());
  156.     }
  157.  
  158.     double readDouble() throws IOException {
  159.         return Double.parseDouble(readString());
  160.     }
  161.  
  162.     int[] readArr(int n) throws IOException {
  163.         int[] res = new int[n];
  164.         for (int i = 0; i < n; i++) {
  165.             res[i] = readInt();
  166.         }
  167.         return res;
  168.     }
  169.  
  170.     long[] readArrL(int n) throws IOException {
  171.         long[] res = new long[n];
  172.         for (int i = 0; i < n; i++) {
  173.             res[i] = readLong();
  174.         }
  175.         return res;
  176.     }
  177.  
  178.     public static void main(String[] args) {
  179.         new J_DSU().run();
  180.     }
  181.  
  182.     public void run() {
  183.         try {
  184.             long t1 = System.currentTimeMillis();
  185.             init();
  186.             solve();
  187.             out.close();
  188.             long t2 = System.currentTimeMillis();
  189.             System.err.println("Time = " + (t2 - t1));
  190.         } catch (Exception e) {
  191.             e.printStackTrace(System.err);
  192.             System.exit(-1);
  193.         }
  194.     }
  195. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement