Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #define _CRT_SECURE_NO_WARNINGS
- #include <iostream>
- #include <cstdio>
- #include <vector>
- #include <algorithm>
- #include <cassert>
- using namespace std;
- const long long N = 100002;
- long long n, d;
- long long a[N];
- long long x[N];
- long long s;
- bool mark[N];
- bool O[N];
- long long ans[N];
- void NO() {
- cerr << "\n///////////////////////////////////////////////////////////\n";
- printf("NO\n");
- exit(0);
- }
- void input() {
- scanf("%d%d",&n,&d);
- for(long long i = 0; i < n; ++i)
- scanf("%d",a+(i-d+n)%n);
- d = 2*d+1;
- }
- void S() {
- vector < long long > v0;
- for(long long i = 0; i < n; ++i)
- s += a[i];
- if(s%d != 0) {
- NO();
- }
- s /= d;
- }
- void X() {
- for(long long i = 0; i < n; ++i) {
- x[i] = a[(i+1)%n] - a[i];
- if(x[i] != 0 && x[i] != 1 && x[i] != -1) {
- NO();
- }
- }
- }
- void solve() {
- vector < long long > v0;
- for(long long i = 0; i < n; ++i) {
- if(mark[i])
- continue;
- long long k = i;
- ans[i] = 0;
- bool okay = 1;
- long long s1 = 0;
- while(!mark[k]) {
- mark[k] = 1;
- long long t = (k+d)%n;
- if(t == i) {
- long long h = ans[k] + x[k];
- if(h != ans[t]){
- okay = 0;
- O[i] = 0;
- break;
- }
- }
- long long h = ans[k] + x[k];
- if(h != 0 && h != 1)
- okay = 0, O[i] = 0;
- if(x[k] != 0)
- O[i] = 0;
- ans[t] = h;
- k = t;
- s1 += ans[k];
- }
- if(O[i] == 1)
- v0.push_back(i);
- if(!okay) {
- s1 = 1;
- ans[i] = 1;
- k = (i+d)%n;
- if(x[i] + ans[i] != 1 && x[i] + ans[i] != 0)
- NO();
- ans[k] = ans[i] + x[i];
- while(k != i) {
- s1 += ans[k];
- long long t = (k+d)%n;
- long long h = ans[k] + x[k];
- if(t == i) {
- if(h != 1)
- NO();
- okay = 1;
- break;
- }
- if(h != 1 && h != 0)
- NO();
- ans[t] = h;
- k = t;
- }
- }
- if(!okay) {
- NO();
- }
- s -= s1;
- }
- if(s < 0)
- NO();
- for(long long i0 = 0; i0 < (int)v0.size(), s > 0; ++i0) {
- long long i = v0[i0];
- ans[i] = 1;
- long long k = (i+d)%n;
- s--;
- while(ans[k] != 1) {
- s--;
- ans[k] = 1;
- k = (k+d)%n;
- }
- }
- if(s != 0)
- NO();
- printf("YES\n");
- for(long long i = 0; i < n; ++i)
- printf("%d ",ans[i]);
- printf("\n");
- }
- int main() {
- fill(O,O+N,true);
- input();
- S();
- X();
- cerr << "\n///////////////////////////////////////////////////////////\n";
- solve();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement