Advertisement
Guest User

Untitled

a guest
Mar 4th, 2015
187
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.57 KB | None | 0 0
  1. #include <iostream>
  2. #include <cstdio>
  3. #include <vector>
  4. #include <string>
  5. #include <cstring>
  6. #include <algorithm>
  7. using namespace std;
  8.  
  9. #ifdef LOCAL
  10. #define eprintf(...) fprintf(stderr, __VA_ARGS__)
  11. #else
  12. #define eprintf(...) 42
  13. #endif
  14.  
  15.  
  16. const int maxt = 1e7 + 1e6;
  17. const int N = (int)1e5 + 100;
  18. int ga[2][N];
  19. long long gans[2][2 * N];
  20. long long inf = 1e18;
  21.  
  22.  
  23. long long dOnPrefix[2 * N];
  24. int inQ[maxt];
  25.  
  26. int st[maxt];
  27. long long sumSt[maxt];
  28. int sizeSt;
  29.  
  30. int getA(int a[], int idx)
  31. {
  32. if (idx >= N) return 0;
  33. return a[idx];
  34. }
  35.  
  36. int getGA(int type, int idx)
  37. {
  38. if (idx >= N) return 0;
  39. return ga[type][idx];
  40. }
  41.  
  42. void addSt(int x)
  43. {
  44. st[sizeSt] = x;
  45. sumSt[sizeSt] = x;
  46. if (sizeSt != 0)
  47. sumSt[sizeSt] += sumSt[sizeSt - 1];
  48. sizeSt++;
  49. if (sizeSt >= maxt)
  50. throw 42;
  51. }
  52. void takeSt(int cnt)
  53. {
  54. sizeSt -= cnt;
  55. }
  56. long long costSt(int cnt)
  57. {
  58. return sumSt[sizeSt - 1] - sumSt[sizeSt - cnt - 1];
  59. }
  60.  
  61. void solve(int n1, int n2, int a[], long long ans[] )
  62. {
  63. memset(dOnPrefix, 0, sizeof dOnPrefix);
  64. memset(inQ, 0, sizeof inQ);
  65.  
  66. long long d = 0;
  67. int inq = 0;
  68. int mt = maxt / n2;
  69. for (int i = 0; i < N; i++)
  70. {
  71. dOnPrefix[i] = d;
  72. inQ[i] = inq;
  73. inq += a[i];
  74. d -= a[i] * 1LL * i;
  75. int x = min(inq, n1);
  76. d += x * 1LL * i;
  77. inq -= x;
  78. }
  79.  
  80. long long sd = 0;
  81. sizeSt = 0;
  82. fprintf(stderr, "%d\n", mt * n2);
  83. for (int i = mt - 1; i >= 0; i--)
  84. {
  85. for (int j = 0; j < n2; j++)
  86. {
  87. addSt(i);
  88. }
  89. sd += costSt(getA(a, i) );
  90. sd -= i * 1LL * getA(a, i);
  91. takeSt(getA(a,i) );
  92.  
  93. if (i < N)
  94. {
  95. ans[i] = sd + dOnPrefix[i] + costSt(inQ[i] );
  96. }
  97. }
  98.  
  99. eprintf("inq: ");
  100. for (int i = 0; i < 10; i++)
  101. eprintf("%d ", inQ[i] );
  102. eprintf("\ndst: ");
  103. for (int i = 0; i < 10; i++)
  104. eprintf("%lld ", dOnPrefix[i] );
  105. eprintf("\n----------------------\n");
  106. }
  107.  
  108.  
  109. int main()
  110. {
  111. freopen("lanes.in", "r", stdin);
  112. #ifndef LOCAL
  113. freopen("lanes.out", "w", stdout);
  114. #endif
  115.  
  116. int n1, n2, m, r;
  117. scanf("%d%d%d%d", &n1, &n2, &m, &r);
  118. for (int i = 0; i < m; i++)
  119. scanf("%d%d", &ga[0][i], &ga[1][i] );
  120. solve(n1 + 1, n1, ga[0], gans[0] );
  121. solve(n2, n2 + 1, ga[1], gans[1] );
  122.  
  123. for (int t = 0; t < 2; t++)
  124. {
  125. for (int i = 0; i < 2 * m; i++)
  126. {
  127. eprintf("%lld ", gans[t][i] );
  128. }
  129. eprintf("\n");
  130. }
  131.  
  132.  
  133. long long answer = inf;
  134. int pos = -1;
  135. for (int i = 0; i < m; i++)
  136. {
  137. long long cur = gans[0][i] + gans[1][i + r];
  138. eprintf("%d : %lld %lld\n", i, gans[0][i], gans[1][i + r] );
  139. if (cur < answer)
  140. {
  141. answer = cur;
  142. pos = i;
  143. }
  144. }
  145. printf("%d\n", pos + 1);
  146.  
  147. return 0;
  148. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement