Guest User

b

a guest
Apr 7th, 2016
279
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 4.80 KB | None | 0 0
  1. // div1 easy
  2. import java.util.ArrayList;
  3.  
  4. public class AlmostFibonacciKnapsack {
  5.   public static int MX = 90;
  6.   public static long[] arr;
  7.   static {
  8.     arr = new long[MX];
  9.     arr[1] = 2;
  10.     arr[2] = 3;
  11.     for (int i = 3; i < arr.length; i++) {
  12.       arr[i] = arr[i-1] + arr[i-2] - 1;
  13.     }
  14.   }
  15.  
  16.   public int[] getIndices(long x) {
  17.     ArrayList<Integer> ans = new ArrayList<>();
  18.     while (x > 0) {
  19.       if (x == 2) {
  20.         ans.add(1);
  21.         break;
  22.       }
  23.       if (x == 3) {
  24.         ans.add(2);
  25.         break;
  26.       }
  27.       for (int i = 1; i+1 < arr.length; i++) {
  28.         if (arr[i+1] > x) {
  29.           if (arr[i]+1 == x) {
  30.             ans.add(i-1);
  31.             ans.add(i-2);
  32.             x -= arr[i-1];
  33.             x -= arr[i-2];
  34.           } else {
  35.             ans.add(i);
  36.             x -= arr[i];
  37.           }
  38.           break;
  39.         }
  40.       }
  41.     }
  42.     int[] res = new int[ans.size()];
  43.     for (int i = 0; i < ans.size(); i++) res[i] = ans.get(i);
  44.     return res;
  45.   }
  46. }
  47.  
  48. // div1 med
  49. import java.util.ArrayList;
  50. import java.util.Arrays;
  51.  
  52. public class AllGraphCuts {
  53.   public int[] findGraph(int[] x) {
  54.     int n = 0;
  55.     while(n*n < x.length) n++;
  56.     int[][] d = new int[n][n];
  57.     for (int i = 0; i < n; i++) {
  58.       for (int j = 0; j < n; j++) {
  59.         d[i][j] = x[i*n+j];
  60.       }
  61.     }
  62.    
  63.     for (int i = 0; i < n; i++) {
  64.       if (d[i][i] != 0)return new int[]{-1};
  65.       for (int j = 0; j < n; j++) {
  66.         if (d[i][j] != d[j][i]) return new int[]{-1};
  67.       }
  68.     }
  69.     for (int i = 0; i < n; i++) {
  70.       for (int j = 0; j < n; j++) {
  71.         for (int k = 0; k < n; k++) {
  72.           if (i != j && d[i][j] < Math.min(d[i][k], d[k][j]))
  73.             return new int[]{-1};
  74.         }
  75.       }
  76.     }
  77.  
  78.     // A max spanning tree will satisfy the conditions
  79.     int[] prev = new int[n];
  80.     int[] max = new int[n];;
  81.     max[0] = 1 << 30;
  82.     boolean[] vis = new boolean[n];
  83.     int[] ans = new int[n-1];
  84.     int aid = 0;
  85.     for (int i = 0; i < n; i++) {
  86.       int idx = 0, mx = -1;
  87.       for (int j = 0; j < n; j++) {
  88.         if (!vis[j] && max[j] > mx) {
  89.           mx = max[j];
  90.           idx = j;
  91.         }
  92.       }
  93.       vis[idx] = true;
  94.       if (i > 0) {
  95.         ans[aid++] = d[idx][prev[idx]] * n * n + idx * n + prev[idx];
  96.       }
  97.       for (int j = 0; j < n; j++) {
  98.         if (!vis[j] && d[idx][j] > max[j]) {
  99.           max[j] = d[idx][j];
  100.           prev[j] = idx;
  101.         }
  102.       }
  103.     }
  104.     return ans;
  105.   }
  106. }
  107.  
  108. // div1 hard (by subscriber)
  109. public class AlienSkiSlopes {
  110.     int n;
  111.     int[][] H;
  112.     int[] ans;
  113.     int bad;
  114.    
  115.     int[][] e;
  116.     int[] q, f;
  117.    
  118.     int[] was;
  119.    
  120.     boolean kun(int x) {
  121.         if (f[x] == 1) return false;
  122.         f[x] = 1;
  123.         for (int i = 0; i < n; i++) if (e[x][i] == 1 && q[i] == -1) {
  124.             q[i] = x;
  125.             return true;
  126.         }
  127.         for (int i = 0; i < n; i++) if (e[x][i] == 1 && kun(q[i])) {
  128.             q[i] = x;
  129.             return true;
  130.         }
  131.         return false;
  132.     }
  133.    
  134.     void dfs(int x) {
  135.         if (was[x] == 1) return;
  136.         was[x] = 1;
  137.         for (int i = 0; i < n; i++) if (e[x][i] == 1) dfs(q[i]);
  138.     }
  139.    
  140.     boolean cut() {
  141.         for (int i = 0; i < n; i++) {
  142.             int ma = -1;
  143.             for (int j = 0; j < n; j++) ma = Math.max(ma,  H[i][j]);
  144.             if (ma < 0) {
  145.                 bad = 1;
  146.                 return false;
  147.             }
  148.             for (int j = 0; j < n; j++) if (H[i][j] == ma) e[i][j] = 1; else e[i][j] = 0;
  149.         }
  150.         for (int i = 0; i < n; i++) q[i] = -1;
  151.         int res = 0;
  152.         for (int i = 0; i < n; i++) {
  153.             for (int j = 0; j < n; j++) f[j] = 0;
  154.             if (kun(i)) res++;
  155.         }
  156.         if (res == n) return false;
  157.        
  158.         for (int i = 0; i < n; i++) was[i] = 0;
  159.         for (int i = 0; i < n; i++) {
  160.             boolean ok = false;
  161.             for (int j = 0; j < n; j++) if (q[j] == i) ok = true;
  162.             if (!ok) {
  163.                 dfs(i);
  164.                 //break;
  165.             }
  166.         }
  167.  
  168.         int[] was2 = new int[n];
  169.         for (int i = 0; i < n; i++) if (was[i] == 1) for (int j = 0; j < n; j++) if (e[i][j] == 1) was2[j] = 1;
  170.        
  171.         int c = (int) 1e9 + 1;
  172.         for (int i = 0; i < n; i++) if (was[i] == 1) {
  173.             int ma = -1;
  174.             for (int j = 0; j < n; j++) ma = Math.max(ma,  H[i][j]);
  175.            
  176.             for (int j = 0; j < n; j++) if (H[i][j] < ma && was2[j] == 0) c = Math.min(c,  ma - H[i][j]);
  177.         }
  178.        
  179.         for (int i = 0; i < n; i++) f[i] = 0;
  180.        
  181.         for (int i = 0; i < n; i++) if (was[i] == 1) for (int j = 0; j < n; j++) if (e[i][j] == 1) f[j] = 1;
  182.        
  183.         for (int i = 0; i < n; i++) if (f[i] == 1) {
  184.             ans[i] += c;
  185.             for (int j = 0; j < n; j++) H[j][i] -= c;
  186.         }
  187.         return true;
  188.     }
  189.    
  190.     public int[] raise(int[] h) {
  191.         n = 1;
  192.         while (n * n < h.length) n++;
  193.        
  194.         H = new int[n][n];
  195.         for (int i = 0; i < n; i++) for (int j = 0; j < n; j++) H[i][j] = h[i * n + j];
  196.         ans = new int[n];
  197.  
  198.         e = new int[n][n];
  199.         q = new int[n];
  200.         f = new int[n];
  201.         was = new int[n];
  202.        
  203.         bad = 0;
  204.         for(;;) {
  205.             if (!cut()) break;
  206.         }
  207.         if (bad == 1) return new int[]{-1};
  208.        
  209.         return ans;
  210.     }
  211. }
Add Comment
Please, Sign In to add comment