Advertisement
Guest User

Untitled

a guest
Dec 6th, 2016
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.44 KB | None | 0 0
  1. import java.io.*;
  2. import java.lang.reflect.Array;
  3. import java.util.*;
  4.  
  5. /**
  6. * Created by Sofia228 on 03.12.16.
  7. */
  8. public class task2 {
  9. static class task {
  10. int tStart;
  11. int time;
  12. int cost;
  13. int index;
  14.  
  15. public task(int tStart, int time, int cost, int index) {
  16. this.tStart = tStart;
  17. this.time = time;
  18. this.cost = cost;
  19. this.index = index;
  20. }
  21. }
  22.  
  23. static class edge {
  24. int b, a, f, c, w;
  25. int bb;
  26.  
  27. public edge(int a, int b, int f, int c, int w, int bb) {
  28. this.b = b;
  29. this.a = a;
  30. this.f = f;
  31. this.c = c;
  32. this.w = w;
  33. this.bb = bb;
  34. }
  35.  
  36. public int ost() {
  37. return c - f;
  38. }
  39. }
  40.  
  41. static int n;
  42.  
  43. static final int N = 110;
  44. static final long INF = 2000000000000000000L;
  45. static ArrayList<ArrayList<edge>> graph = new ArrayList<>();
  46. static ArrayList<task> tasks;
  47.  
  48. private static int binSearch(int time) {
  49. int l = 0, r = n;
  50. while (r - l > 0) {
  51. int m = (l + r + 1) >> 1;
  52. //makeNewArr(m);
  53. if (tasks.get(m).tStart >= time) {
  54. r = m;
  55. } else {
  56. l = m;
  57. }
  58. if (r - l == 1) break;
  59. }
  60. if (tasks.get(l).tStart < time) return l + 1;
  61. return l;
  62. }
  63.  
  64. static int k;
  65.  
  66. public static void main(String[] args) throws IOException {
  67. BufferedReader in = new BufferedReader(new FileReader("minimax.in"));
  68. PrintWriter out = new PrintWriter(new File("mincost.out"));
  69. StringTokenizer t = new StringTokenizer(in.readLine());
  70. n = Integer.parseInt(t.nextToken());
  71. k = Integer.parseInt(t.nextToken());
  72. tasks = new ArrayList<>();
  73. for (int i = 1; i <= n; i++) {
  74. t = new StringTokenizer(in.readLine());
  75. tasks.add(new task(
  76. Integer.parseInt(t.nextToken()),
  77. Integer.parseInt(t.nextToken()),
  78. Integer.parseInt(t.nextToken()) * -1,
  79. i));
  80. }
  81. n += 1;
  82. tasks.add(
  83. new task(Integer.MAX_VALUE, 0, 0, n)
  84. );
  85. Collections.sort(tasks, new Comparator<task>() {
  86. @Override
  87. public int compare(task o1, task o2) {
  88. int ans = Integer.compare(o1.tStart, o2.tStart);
  89. return ans == 0 ? Integer.compare(o1.time, o2.time) : ans;
  90. }
  91. });
  92. for (int i = 0; i <= n; i++) {
  93. graph.add(new ArrayList<>());
  94. }
  95. for (int i = 0; i < tasks.size() - 1; i++) {
  96. int index = i;
  97. while (tasks.get(++index).tStart < tasks.get(i).time + tasks.get(i).tStart) ;
  98. //int index = binSearch(tasks.get(i).time + tasks.get(i).tStart);
  99. addEdge(tasks.get(i).index, tasks.get(index).index, 1, tasks.get(i).cost);
  100. addEdge(tasks.get(i).index, tasks.get(i + 1).index, k, 0);
  101. }
  102. boolean[] used = new boolean[n + 6];
  103. Arrays.fill(used, false);
  104.  
  105. for (int i = 0; i < 1; i++) {
  106. mF(n);
  107. //int kykyshka = 0;
  108. for (ArrayList<edge> arr : graph) {
  109. //boolean ttt = true;
  110. int ii = 0;
  111. for (edge ee : arr) {
  112. if (ee.f == 1) {
  113. used[ii] = true;
  114. //System.out.print(1 + " ");
  115. //ttt = false;
  116. break;
  117. }
  118. ii++;
  119. }
  120. //if (ttt && kykyshka != 0 && kykyshka != n)
  121. // System.out.print(0 + " ");
  122. //kykyshka++;
  123. }
  124.  
  125. for (int j = 1; j < n; ++j) {
  126. System.out.print((used[j] ? 1 : 0) + " ");
  127. }
  128. System.out.println();
  129. Arrays.fill(used, false);
  130.  
  131. }
  132. out.close();
  133. }
  134.  
  135. private static long mF(int n) {
  136. long result = 0;
  137. long total = 0;
  138.  
  139. int p[] = new int[n + 1];
  140. int q[] = new int[N];
  141.  
  142. int pInd[] = new int[n + 1];
  143. long curF = 0;
  144. while (curF < k) {
  145.  
  146. int s = 0;
  147. int e = 0;
  148.  
  149. long d[] = new long[n + 1];
  150.  
  151. int used2[] = new int[n + 1];
  152. for (int i = 1; i < d.length; i++) {
  153. d[i] = INF;
  154. }
  155. d[1] = 0;
  156. q[e++] = 1;
  157. used2[1] = 1;
  158. e = e == N ? 0 : e;
  159.  
  160. while (s != e) {
  161. int x = q[s++];
  162. if (s == N) s = 0;
  163. used2[x] = 2;
  164. int i = 0;
  165. for (edge cur : graph.get(x)) {
  166. if (cur.ost() != 0 && d[x] + cur.w < d[cur.b]) {
  167. d[cur.b] = cur.w + d[x];
  168. if (used2[cur.b] == 0) {
  169. q[e++] = cur.b;
  170. e = e == N ? 0 : e;
  171. } else if (used2[cur.b] == 2) {
  172. s = s == 0 ? N - 1 : s - 1;
  173. q[s] = cur.b;
  174. }
  175. used2[cur.b] = 1;
  176. p[cur.b] = x;
  177. pInd[cur.b] = i;
  178. }
  179. i++;
  180. }
  181. }
  182. if (d[n] == INF)
  183. break;
  184.  
  185. long f = INF;
  186. for (int cur = n; cur != 1; cur = p[cur]) {
  187. if (graph.get(p[cur]).get(pInd[cur]).ost() < f) {
  188. f = Math.min(f, graph.get(p[cur]).get(pInd[cur]).c - graph.get(p[cur]).get(pInd[cur]).f);
  189. }
  190. }
  191.  
  192. curF += f;
  193.  
  194. for (int cur = n; cur != 1; cur = p[cur]) {
  195. graph.get(p[cur]).get(pInd[cur]).f += f;
  196. graph.get(cur).get(graph.get(p[cur]).get(pInd[cur]).bb).f -= f;
  197. result += graph.get(p[cur]).get(pInd[cur]).w * f;
  198. }
  199. }
  200. return result;
  201. }
  202.  
  203. static void addEdge(int from, int to, int c, int w) {
  204. edge a = new edge(from, to, 0, c, w, graph.get(to).size());
  205. edge b = new edge(to, from, 0, 0, -w, graph.get(from).size());
  206. graph.get(from).add(a);
  207. graph.get(to).add(b);
  208. }
  209. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement