Advertisement
Guest User

Untitled

a guest
Feb 23rd, 2017
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.01 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. int V, E, Q, C, capmx;
  6. int sz[10005];
  7. int lat[1005];
  8. int exist[1005][10005];
  9. vector < pair<int, int> > parent[1005];
  10. vector < pair<int, int> > child[1005];
  11. int h[10000005];
  12. int inheap[10000005];
  13. int heapsz;
  14.  
  15. int reqE[1005][10005];
  16.  
  17. struct request{
  18. int tot, pos;
  19. }reqS[1005][10005];
  20. int cap[1005];
  21. vector <int> cache[1005];
  22.  
  23. int ALL;
  24. struct thing{
  25. int save, server, video;
  26. bool rem;
  27. }everyone[10000005];
  28.  
  29. void ascend(int pos){
  30. while(everyone[h[pos]].save > everyone[h[pos / 2]].save && pos != 1){
  31. swap(inheap[h[pos]], inheap[h[pos / 2]]);
  32. swap(h[pos], h[pos / 2]);
  33. }
  34. }
  35.  
  36. void descend(int pos){
  37. while(pos <= heapsz){
  38. if(everyone[h[pos]].save < everyone[h[2 * pos]].save){
  39. swap(inheap[h[pos]], inheap[h[2 * pos]]);
  40. swap(h[pos], h[2 * pos]);
  41. pos *= 2;
  42. }else if(everyone[h[pos]].save < everyone[h[2 * pos + 1]].save){
  43. swap(inheap[h[pos]], inheap[h[2 * pos + 1]]);
  44. swap(h[pos], h[2 * pos + 1]);
  45. pos *= 2;
  46. pos++;
  47. }else{
  48. break;
  49. }
  50. }
  51. }
  52.  
  53. void add(int pos){
  54. heapsz++;
  55. inheap[pos] = heapsz;
  56. h[heapsz] = pos;
  57. ascend(heapsz);
  58. }
  59.  
  60. void rem(int pos){
  61. pos = inheap[pos];
  62. swap(inheap[h[pos]], inheap[h[heapsz]]);
  63. swap(h[pos], h[heapsz]);
  64. heapsz--;
  65. if(everyone[h[pos]].save > everyone[h[pos / 2]].save && pos != 1){
  66. ascend(pos);
  67. }else{
  68. descend(pos);
  69. }
  70. }
  71.  
  72. bool comp(const thing &a, const thing &b){
  73. return a.save > b.save;
  74. }
  75.  
  76. void solve(const int &node, const int &video){
  77. for(auto it : parent[node]){
  78. everyone[reqS[it.first][video].pos].save -= reqE[node][video] * (lat[node] - it.second);
  79. if(everyone[reqS[it.first][video].pos].save == 0 && everyone[reqS[it.first][video].pos].rem == 0){
  80. rem(reqS[it.first][video].pos);
  81. everyone[reqS[it.first][video].pos].rem = 1;
  82. }else{
  83. descend(inheap[reqS[it.first][video].pos]);
  84. }
  85. }
  86. }
  87.  
  88. int main()
  89. {
  90. ifstream fin("1.in");
  91. ofstream fout("home.out");
  92. fin>>V>>E>>Q>>C>>capmx;
  93. int i,j;
  94. for(i = 1;i <= V;i++){
  95. fin>>sz[i];
  96. }
  97. for(i = 1;i <= E;i++){
  98. fin>>lat[i];
  99. int c;
  100. fin>>c;
  101. for(j = 1;j <= c;j++){
  102. int t,l;
  103. fin>>t>>l;
  104. t++;
  105. parent[i].push_back({t, l});
  106. child[t].push_back({i, l});
  107. }
  108. }
  109. for(i = 1;i <= Q;i++){
  110. int rv,re,rn;
  111. fin>>rv>>re>>rn;
  112. re++;
  113. rv++;
  114. reqE[re][rv] += rn;
  115. for(auto it : parent[re]){
  116. reqS[it.first][rv].tot += rn * (lat[re] - it.second);
  117. }
  118. }
  119. for(i = 1;i <= C;i++){
  120. for(j = 1;j <= V;j++){
  121. if(reqS[i][j].tot){
  122. ++ALL;
  123. everyone[ALL].save = reqS[i][j].tot;
  124. everyone[ALL].server = i;
  125. everyone[ALL].video = j;
  126. }
  127. }
  128. }
  129. sort(everyone + 1, everyone + ALL + 1, comp);
  130. for(i = 1;i <= ALL;i++){
  131. reqS[everyone[i].server][everyone[i].video].pos = i;
  132. add(i);
  133. }
  134. for(i = 1;i <= ALL;i++){
  135. thing t;
  136. t = everyone[i];
  137. if(cap[t.server] + sz[t.video] <= capmx && exist[t.server][t.video] == 0 && t.save){
  138. exist[t.server][t.video] = 1;
  139. cap[t.server] += sz[t.video];
  140. cache[t.server].push_back(t.video);
  141. for(auto it : child[t.server]){
  142. solve(it.first, t.video);
  143. }
  144. }
  145. }
  146. int n = 0;
  147. for(i = 1;i <= C;i++){
  148. if(cache[i].size()){
  149. n++;
  150. }
  151. }
  152. fout<<n<<'\n';
  153. for(i = 1;i <= C;i++){
  154. if(cache[i].size()){
  155. fout<<i - 1<<' ';
  156. for(auto it : cache[i]){
  157. fout<<it - 1<<' ';
  158. }
  159. fout<<'\n';
  160. }
  161. }
  162. return 0;
  163. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement