Guest User

bb

a guest
Dec 18th, 2015
421
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 5.61 KB | None | 0 0
  1. // div1 easy
  2. public class WaterTank {
  3.   public int[] t,x;
  4.   public int C;
  5.   public double minOutputRate(int[] _t, int[] _x, int _C) {
  6.     t = _t; x = _x; C = _C;
  7.     double lo = 0, hi = 1e6;
  8.     for (int iter = 0; iter < 200; iter++) {
  9.       double mid = (lo+hi)/2.;
  10.       if(can(mid)) hi = mid;
  11.       else lo = mid;
  12.     }
  13.     return lo;
  14.   }
  15.  
  16.   public boolean can(double outp) {
  17.     double curcap = 0;
  18.     for (int i = 0; i < t.length; i++) {
  19.       double rate = x[i] - outp;
  20.       curcap = Math.max(0, curcap + rate * t[i]);
  21.       if (curcap > C) return false;
  22.     }
  23.     return true;
  24.   }
  25. }
  26.  
  27. // div1 med
  28. public class BoardEscape {\
  29.   public int[] dx = {-1,0,1,0}, dy = {0,-1,0,1};
  30.   public String findWinner(String[] s, int k) {
  31.     if (k >= 4) {
  32.       k = (k % 2) + 4;
  33.     }
  34.     int n = s.length, m = s[0].length();
  35.     char[][] board = new char[n][m];
  36.     for (int i = 0; i < n; i++)
  37.         board[i] = s[i].toCharArray();
  38.    
  39.     int[][][] nim = new int[k+1][n][m];
  40.     for (int t = 1; t <= k; t++) {
  41.       for (int i = 0; i < n; i++) {
  42.         for (int j = 0; j < m; j++) {
  43.           if (board[i][j] == 'E') continue;
  44.           boolean[] seen = new boolean[5];
  45.           for (int r = 0; r < 4; r++) {
  46.             int nx = i+dx[r], ny = j+dy[r];
  47.             if (nx < 0 || nx >= n || ny < 0 | ny >= m || board[nx][ny] == '#') continue;
  48.             seen[nim[t-1][nx][ny]] = true;
  49.           }
  50.           int idx = 0;
  51.           while(seen[idx]) idx++;
  52.           nim[t][i][j] = idx;
  53.         }
  54.       }
  55.     }
  56.    
  57.     int xor = 0;
  58.     for (int i = 0; i < n; i++) {
  59.       for (int j = 0; j < m; j++) {
  60.         if (board[i][j] == 'T') {
  61.           xor ^= nim[k][i][j];
  62.         }
  63.       }
  64.     }
  65.    
  66.     return xor == 0 ? "Bob" : "Alice";
  67.   }
  68. }
  69.  
  70. // div1 hard
  71. import java.util.Arrays;
  72. public class Farmville {
  73.   public String[] d;
  74.   public int[] t,c;
  75.   public int n;
  76.  
  77.   public int minTime(String[] s, int[] time, int[] cost, int budget) {
  78.     d = s;
  79.     t = time;
  80.     c = cost;
  81.     n = time.length;
  82.     int lo = 0, hi = 25 * n;
  83.     while (lo < hi) {
  84.       int mid = (lo + hi) / 2;
  85.       long g = getCost(mid);
  86.       if (g > budget) lo = mid+1;
  87.       else hi = mid;
  88.     }
  89.     return lo;
  90.   }
  91.  
  92.   public long getCost(int time) {
  93.     int nn = 2+2*n*(time+1);
  94.     int[][][] id = new int[2][n][time+2];
  95.     for (int i = 0; i < 2; i++)
  96.       for (int j = 0; j < n; j++) {
  97.         id[i][j][time+1] = nn-2;
  98.         for (int k = 0; k <= time; k++)
  99.           id[i][j][k] = 2*(n*k+j)+i;
  100.       }
  101.     MaxFlow f = new MaxFlow(nn,50*(time+1)+n*25+4*n*(time+1)+n);
  102.     for (int i = 0; i < n; i++)
  103.       f.add_edge(nn-1, id[0][i][0], INF);
  104.    
  105.     for (int i = 0; i < n; i++) {
  106.       for (int j = 0; j < t[i]; j++) {
  107.         int k = Math.min(j, time+1);
  108.         f.add_edge(nn-1, id[1][i][k], c[i]);
  109.       }
  110.     }
  111.    
  112.     for (int i = 0; i < n; i++) {
  113.       for (int j = 0; j <= time; j++) {
  114.         int k = Math.min(time+1,j+t[i]);
  115.         f.add_edge(id[0][i][j], id[1][i][k], c[i]);
  116.         f.add_edge(id[0][i][j], id[1][i][j], INF);
  117.         int r = Math.min(time+1, j+1);
  118.         f.add_edge(id[0][i][r], id[0][i][j], INF);
  119.         f.add_edge(id[1][i][r], id[1][i][j], INF);
  120.       }
  121.     }
  122.    
  123.     for (int i = 0; i < n; i++) {
  124.       for (int j = 0; j < n; j++) {
  125.         if (d[i].charAt(j) == '1') {
  126.           for (int k = 0; k <= time; k++) {
  127.             f.add_edge(id[1][j][k], id[0][i][k], INF);
  128.           }
  129.         }
  130.       }
  131.     }
  132.    
  133.     return f.dinic(nn-1,nn-2);
  134.   }
  135.  
  136.   public static long INF = 1l << 50;
  137.   static class MaxFlow {
  138.     public long[] flow, capa;
  139.     public int[] now, level, eadj, eprev, elast;
  140.     public int eidx, N, M;
  141.    
  142.     public MaxFlow(int nodes, int edges) {
  143.       this.N = nodes;
  144.       this.M = edges;
  145.      
  146.       flow = new long[2*M];
  147.       capa = new long[2*M];
  148.       eadj = new int[2*M];
  149.       eprev = new int[2*M];
  150.       elast = new int[N];
  151.       level = new int[N];
  152.       now = new int[N];
  153.       Arrays.fill(elast, -1);
  154.       eidx = 0;
  155.     }
  156.    
  157.     public void add_edge(int a, int b, long c) {
  158.       eadj[eidx] = b; flow[eidx] = 0; capa[eidx] = c; eprev[eidx] = elast[a]; elast[a] = eidx++;
  159.       eadj[eidx] = a; flow[eidx] = c; capa[eidx] = c; eprev[eidx] = elast[b]; elast[b] = eidx++;
  160.     }
  161.  
  162.     public long dinic(int source, int sink) {
  163.       long res, flow = 0;
  164.       while (bfs(source, sink)) {
  165.         System.arraycopy(elast, 0, now, 0, N);
  166.         while ((res = dfs(source, INF, sink)) > 0)
  167.           flow += res;
  168.       }
  169.       return flow;
  170.     }
  171.  
  172.     private boolean bfs(int source, int sink) {
  173.       Arrays.fill(level, -1);
  174.       int front = 0, back = 0;
  175.       int[] queue = new int[N];
  176.  
  177.       level[source] = 0;
  178.       queue[back++] = source;
  179.  
  180.       while (front < back && level[sink] == -1) {
  181.         int node = queue[front++];
  182.         for (int e = elast[node]; e != -1; e = eprev[e]) {
  183.           int to = eadj[e];
  184.           if (level[to] == -1 && flow[e] < capa[e]) {
  185.             level[to] = level[node] + 1;
  186.             queue[back++] = to;
  187.           }
  188.         }
  189.       }
  190.  
  191.       return level[sink] != -1;
  192.     }
  193.  
  194.     private long dfs(int cur, long curflow, int goal) {
  195.       if (cur == goal) return curflow;
  196.  
  197.       for (int e = now[cur]; e != -1; now[cur] = e = eprev[e]) {
  198.         if (level[eadj[e]] > level[cur] && flow[e] < capa[e]) {
  199.           long res = dfs(eadj[e], Math.min(curflow, capa[e] - flow[e]), goal);
  200.           if (res > 0) {
  201.             flow[e] += res;
  202.             flow[e ^ 1] -= res;
  203.             return res;
  204.           }
  205.         }
  206.       }
  207.       return 0;
  208.     }
  209.   }
  210. }
Add Comment
Please, Sign In to add comment