Advertisement
Guest User

Untitled

a guest
Jul 24th, 2016
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.39 KB | None | 0 0
  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <iostream>
  3. #include <cstdio>
  4. #include <vector>
  5. #include <algorithm>
  6. #include <cassert>
  7. using namespace std;
  8.  
  9. const long long N = 100002;
  10.  
  11. long long n, d;
  12. long long a[N];
  13. long long x[N];
  14. long long s;
  15.  
  16. bool mark[N];
  17. bool O[N];
  18.  
  19. long long ans[N];
  20.  
  21. void NO() {
  22.     cerr << "\n///////////////////////////////////////////////////////////\n";
  23.     printf("NO\n");
  24.     exit(0);
  25. }
  26.  
  27. void input() {
  28.     scanf("%d%d",&n,&d);
  29.     for(long long i = 0; i < n; ++i)
  30.         scanf("%d",a+(i-d+n)%n);
  31.     d = 2*d+1;
  32. }
  33.  
  34. void S() {
  35.     vector < long long > v0;
  36.  
  37.     for(long long i = 0; i < n; ++i)
  38.         s += a[i];
  39.     if(s%d != 0) {
  40.         NO();
  41.     }
  42.     s /= d;
  43. }
  44.  
  45. void X() {
  46.     for(long long i = 0; i < n; ++i) {
  47.         x[i] = a[(i+1)%n] - a[i];
  48.         if(x[i] != 0 && x[i] != 1 && x[i] != -1) {
  49.            
  50.             NO();
  51.         }
  52.     }
  53. }
  54.  
  55. void solve() {
  56.     vector  < long long > v0;
  57.     for(long long i = 0; i < n; ++i) {
  58.         if(mark[i])
  59.             continue;
  60.  
  61.         long long k = i;
  62.         ans[i] = 0;
  63.         bool okay = 1;
  64.         long long s1 = 0;
  65.  
  66.         while(!mark[k]) {
  67.             mark[k] = 1;
  68.             long long t = (k+d)%n;
  69.             if(t == i) {
  70.                 long long h = ans[k] + x[k];
  71.                 if(h != ans[t]){
  72.                     okay = 0;
  73.                     O[i] = 0;
  74.                     break;
  75.                 }
  76.             }
  77.  
  78.             long long h = ans[k] + x[k];
  79.  
  80.             if(h != 0 && h != 1)
  81.                 okay = 0, O[i] = 0;
  82.  
  83.             if(x[k] != 0)
  84.                 O[i] = 0;
  85.  
  86.             ans[t] = h;
  87.  
  88.             k = t;
  89.             s1 += ans[k];
  90.         }
  91.  
  92.         if(O[i] == 1)
  93.             v0.push_back(i);
  94.  
  95.         if(!okay) {
  96.             s1 = 1;
  97.             ans[i] = 1;
  98.             k = (i+d)%n;
  99.             if(x[i] + ans[i] != 1 && x[i] + ans[i] != 0)
  100.                 NO();
  101.  
  102.             ans[k] = ans[i] + x[i];
  103.             while(k != i) {
  104.                 s1 += ans[k];
  105.                 long long t = (k+d)%n;
  106.                 long long h = ans[k] + x[k];
  107.  
  108.                 if(t == i) {
  109.                     if(h != 1)
  110.                         NO();
  111.                     okay = 1;
  112.                     break;
  113.                 }
  114.                
  115.                 if(h != 1 && h != 0)
  116.                     NO();
  117.  
  118.                 ans[t] = h;
  119.                 k = t;
  120.             }
  121.         }
  122.  
  123.         if(!okay) {
  124.             NO();
  125.         }
  126.         s -= s1;
  127.     }
  128.  
  129.     if(s < 0)
  130.         NO();
  131.  
  132.     for(long long i0 = 0; i0 < (int)v0.size(), s > 0; ++i0) {
  133.         long long i = v0[i0];
  134.  
  135.         ans[i] = 1;
  136.         long long k = (i+d)%n;
  137.         s--;
  138.  
  139.         while(ans[k] != 1) {
  140.             s--;
  141.             ans[k] = 1;
  142.             k = (k+d)%n;
  143.         }
  144.     }
  145.  
  146.     if(s != 0)
  147.         NO();
  148.  
  149.     printf("YES\n");
  150.     for(long long i = 0; i < n; ++i)
  151.         printf("%d ",ans[i]);
  152.     printf("\n");
  153. }
  154.  
  155. int main() {
  156.     fill(O,O+N,true);
  157.     input();
  158.     S();
  159.     X();
  160.     cerr << "\n///////////////////////////////////////////////////////////\n";
  161.     solve();
  162.  
  163.     return 0;
  164. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement