Guest User

Untitled

a guest
May 29th, 2016
265
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.42 KB | None | 0 0
  1. /*
  2. ID: ashish1610
  3. PROG:
  4. LANG: C++
  5. */
  6. #include <message.h>
  7. #include "crates.h"
  8. #include <bits/stdc++.h>
  9. using namespace std;
  10. #define ll              long long int
  11. #define MOD             1000000007
  12. #define si(a)           scanf("%d", &a)
  13. #define sl(a)           scanf("%lld", &a)
  14. #define pi(a)           printf("%d", a)
  15. #define pl(a)           printf("%lld", a)
  16. #define pn              printf("\n")
  17. ll pow_mod(ll a, ll b) {
  18.     ll res = 1;
  19.     while(b) {
  20.         if(b & 1)
  21.             res = (res * a) % MOD;
  22.         a = (a * a) % MOD;
  23.         b >>= 1;
  24.     }
  25.     return res;
  26. }
  27. int main() {
  28.     ll N = GetNumStacks();
  29.  
  30.     ll nodeId = MyNodeId();
  31.     ll nodes = NumberOfNodes();
  32.  
  33.     ll l = (nodeId * N) / nodes;
  34.     ll r = ((nodeId + 1) * N) / nodes;
  35.  
  36.     ll sm = 0;
  37.     for(int i = l + 1; i <= r ;++i) {
  38.         sm += GetStackHeight(i);
  39.     }
  40.  
  41.     PutLL(0, sm);
  42.     Send(0);
  43.  
  44.     if(nodeId == 0) {
  45.         ll final_sm = 0;
  46.         for(int i = 0; i < nodes; ++i) {
  47.             Receive(i);
  48.             final_sm += GetLL(i);
  49.         }
  50.         for(int i = 0; i < nodes; ++i) {
  51.             PutLL(i, final_sm);
  52.             Send(i);
  53.         }
  54.     }
  55.  
  56.     if(nodeId > 0) {
  57.         Receive(0);
  58.         ll tot_sm = GetLL(0);
  59.        
  60.         Receive(nodeId - 1);
  61.         ll ext = GetLL(nodeId - 1);
  62.         ll lft_cnt = GetLL(nodeId - 1);
  63.        
  64.         ll running_res = GetLL(nodeId - 1);
  65.  
  66.         vector < ll > v;
  67.         for(int i = l + 1; i <= r; ++i) {
  68.             v.push_back(GetStackHeight(i));
  69.         }
  70.         v.push_back(0);
  71.  
  72.         ll lft_sm = tot_sm / N;
  73.         if(tot_sm % N) {
  74.             lft_sm += 1;
  75.         }
  76.  
  77.         ll rgt_sm = tot_sm / N;
  78.  
  79.         v[0] += ext;
  80.  
  81.         for(int i = 0; i < (int)(v.size() - 1); ++i) {
  82.             if(lft_cnt > 0) {
  83.                 if(v[i] < lft_sm) {
  84.                     running_res = (running_res + (lft_sm - v[i])) % MOD;
  85.                     v[i + 1] -= (lft_sm - v[i]);
  86.                     v[i] = lft_sm;
  87.                 } else if(v[i] > lft_sm) {
  88.                     running_res = (running_res + (v[i] - lft_sm)) % MOD;
  89.                     v[i + 1] += (v[i] - lft_sm);
  90.                     v[i] = lft_sm;
  91.                 }
  92.                 lft_cnt -= 1;
  93.             } else {
  94.                 if(v[i] < rgt_sm) {
  95.                     running_res = (running_res + (rgt_sm - v[i])) % MOD;
  96.                     v[i + 1] -= (rgt_sm - v[i]);
  97.                     v[i] = rgt_sm;
  98.                 } else if(v[i] > rgt_sm) {
  99.                     running_res = (running_res + (v[i] - rgt_sm)) % MOD;
  100.                     v[i + 1] += (v[i] - rgt_sm);
  101.                     v[i] = rgt_sm;
  102.                 }
  103.             }
  104.         }
  105.  
  106.         if(nodeId == nodes - 1) {
  107.             cout << running_res << endl;
  108.         } else {
  109.             PutLL(nodeId + 1, v.back());
  110.             PutLL(nodeId + 1, lft_cnt);
  111.             PutLL(nodeId + 1, running_res);
  112.             Send(nodeId + 1);
  113.         }
  114.     } else if(nodeId == 0) {
  115.         Receive(0);
  116.         ll tot = GetLL(0);
  117.         vector < ll > v;
  118.         for(int i = l + 1; i <= r; ++i) {
  119.             v.push_back(GetStackHeight(i));
  120.             // tot += GetStackHeight(i);
  121.         }
  122.         v.push_back(0);
  123.  
  124.         ll moves = 0;
  125.  
  126.         ll lft_cnt = tot % N;
  127.         ll lft_sm = tot / N;
  128.         if(tot % N) {
  129.             lft_sm += 1;
  130.         }
  131.  
  132.         ll rgt_cnt = N - lft_cnt;
  133.         ll rgt_sm = tot / N;
  134.  
  135.         for(int i = 0; i < (int)(v.size() - 1); ++i) {
  136.             if(lft_cnt > 0) {
  137.                 if(v[i] < lft_sm) {
  138.                     moves = (moves + (lft_sm - v[i])) % MOD;
  139.                     v[i + 1] -= (lft_sm - v[i]);
  140.                     v[i] = lft_sm;
  141.                 } else if(v[i] > lft_sm) {
  142.                     moves = (moves + (v[i] - lft_sm)) % MOD;
  143.                     v[i + 1] += (v[i] - lft_sm);
  144.                     v[i] = lft_sm;
  145.                 }
  146.                 lft_cnt -= 1;
  147.             } else {
  148.                 if(v[i] < rgt_sm) {
  149.                     moves = (moves + (rgt_sm - v[i])) % MOD;
  150.                     v[i + 1] -= (rgt_sm - v[i]);
  151.                     v[i] = rgt_sm;
  152.                 } else if(v[i] > rgt_sm) {
  153.                     moves = (moves + (v[i] - rgt_sm)) % MOD;
  154.                     v[i + 1] += (v[i] - rgt_sm);
  155.                     v[i] = rgt_sm;
  156.                 }
  157.             }
  158.         }
  159.         PutLL(nodeId + 1, v.back());
  160.         PutLL(nodeId + 1, lft_cnt);
  161.         PutLL(nodeId + 1, moves);
  162.         Send(nodeId + 1);
  163.     }
  164.     return 0;
  165. }
Add Comment
Please, Sign In to add comment