Advertisement
Guest User

Untitled

a guest
Jul 31st, 2012
65
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 3.73 KB | None | 0 0
  1. import java.io.*;
  2. import java.util.*;
  3. import static java.lang.Math.*;
  4.  
  5. public class F implements Runnable {
  6.  
  7.     final boolean LOCAL = new File("C:/Windows/System32/drivers/etc/hosts").exists();
  8.     final String PROBLEM_NAME = getClass().getSimpleName().toLowerCase();
  9.    
  10.     BufferedReader in;
  11.     PrintWriter out;
  12.     StringTokenizer tok;
  13.  
  14.     public static void main(String[] args) {
  15.         new Thread(null, new F(), "", 256 * (1L << 20)).start();
  16.     }
  17.  
  18.     @Override
  19.     public void run() {
  20.         try {
  21.             long startTime = 0, endTime = 0;
  22.             long freeMemory = 0, totalMemory = 0;
  23.             if (LOCAL) {
  24.                 startTime = System.currentTimeMillis();
  25.             }
  26.             Locale.setDefault(Locale.US);
  27.             if (LOCAL) {
  28.                 in = new BufferedReader(new FileReader("input.txt"));
  29.                 out = new PrintWriter("output.txt");
  30.             } else {
  31. //              in = new BufferedReader(new FileReader(PROBLEM_NAME + ".in"));
  32. //              out = new PrintWriter(PROBLEM_NAME + ".out");
  33.                 in = new BufferedReader(new InputStreamReader(System.in));
  34.                 out = new PrintWriter(System.out);
  35. //              in = new BufferedReader(new FileReader("input.txt"));
  36. //              out = new PrintWriter("output.txt");
  37.             }
  38.             tok = new StringTokenizer("");
  39.             solve();
  40.             in.close();
  41.             out.close();
  42.             if (LOCAL) {
  43.                 endTime = System.currentTimeMillis();
  44.                 freeMemory = Runtime.getRuntime().freeMemory();
  45.                 totalMemory = Runtime.getRuntime().totalMemory();
  46.             }
  47.             if (LOCAL) {
  48.                 System.err.println("Time = " + (endTime - startTime));
  49.                 System.err.println("Memory = " + ((totalMemory - freeMemory) >> 10));
  50.             }
  51.         } catch (Throwable t) {
  52.             t.printStackTrace(System.err);
  53.             System.exit(-1);
  54.         }
  55.     }
  56.  
  57.     String readString() throws IOException {
  58.         while (!tok.hasMoreTokens()) {
  59.             String line = in.readLine();
  60.             if (line == null) return null;
  61.             tok = new StringTokenizer(line);
  62.         }
  63.         return tok.nextToken();
  64.     }
  65.  
  66.     int readInt() throws IOException {
  67.         return Integer.parseInt(readString());
  68.     }
  69.  
  70.     long readLong() throws IOException {
  71.         return Long.parseLong(readString());
  72.     }
  73.  
  74.     double readDouble() throws IOException {
  75.         return Double.parseDouble(readString());
  76.     }
  77.    
  78.     void debug(Object... o) {
  79.         if (LOCAL) {
  80.             System.err.println(Arrays.deepToString(o));
  81.         }
  82.     }
  83.  
  84.     // solution
  85.    
  86.     int n;
  87.     int[] a = new int[100000];
  88.     int[] heapIds = new int[10000005];
  89.     int[] heapValues = new int[10000005];
  90.     int size;
  91.     long ans;
  92.    
  93.     void update(int i, int x) {
  94.         if (i < 0 || i >= n) return;
  95.         if (a[i] <= x) return;
  96.         ans += a[i] - x;
  97.         a[i] = x;
  98.         push(a[i], i);
  99.     }
  100.    
  101.     void solve() throws IOException {
  102.         int T = readInt();
  103.         for (int t = 1; t <= T; t++) {
  104.             size = 0;
  105.             n = readInt();
  106.             for (int i = 0; i < n; i++) {
  107.                 a[i] = readInt();
  108.                 push(a[i], i);
  109.             }
  110.             ans = 0;
  111.             while (size > 0) {
  112.                 int x = heapValues[1];
  113.                 int i = heapIds[1];
  114.                 pop();
  115.                 if (a[i] != x) continue;
  116.                 update(i-1, x+1);
  117.                 update(i+1, x+1);
  118.             }
  119.             out.println(ans);
  120.         }
  121.     }
  122.  
  123.     private void pop() {
  124.         heapValues[1] = heapValues[size];
  125.         heapIds[1] = heapIds[size];
  126.         size--;
  127.         int k = 1;
  128.         while (true) {
  129.             int minK = k;
  130.             if (2*k <= size) {
  131.                 if (heapValues[2*k] < heapValues[minK]) {
  132.                     minK = 2*k;
  133.                 }
  134.             }
  135.             if (2*k+1 <= size) {
  136.                 if (heapValues[2*k+1] < heapValues[minK]) {
  137.                     minK = 2*k+1;
  138.                 }
  139.             }
  140.             if (minK == k) {
  141.                 break;
  142.             }
  143.             swap(k, minK);
  144.             k = minK;
  145.         }
  146.     }
  147.  
  148.     private void swap(int i, int j) {
  149.         int t = heapIds[i]; heapIds[i] = heapIds[j]; heapIds[j] = t;
  150.         t = heapValues[i]; heapValues[i] = heapValues[j]; heapValues[j] = t;
  151.     }
  152.  
  153.     private void push(int x, int i) {
  154.         size++;
  155.         heapIds[size] = i;
  156.         heapValues[size] = x;
  157.         int k = size;
  158.         while (k > 1) {
  159.             if (heapValues[k] >= heapValues[k / 2]) {
  160.                 break;
  161.             }
  162.             swap(k, k/2);
  163.             k /= 2;
  164.         }
  165.     }
  166.    
  167. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement