提交时间:2025-11-10 17:15:58
运行 ID: 38850
#include<bits/stdc++.h> #define int long long using namespace std; inline char fgc() { static char buf[1 << 17], *p = buf, *q = buf; return p == q && (q = buf + fread(p = buf, 1, 1 << 17, stdin), p == q) ? EOF : *p++; } inline void read(int &x) { x = 0; int s = fgc(), f = 1; for (; s < '0' || '9' < s; s = fgc()) f = s == '-' ? -f : f; for (; '0' <= s && s <= '9'; s = fgc()) x = x * 10 + (s ^ '0'); x*=f; } int n,a[20000005],s[20000005]; bitset<20000005> ans,ok; struct que{ int q[10000005],l,r; que(){ l=1,r=0; } bool empty(){ return l>r; } int back(){ return q[r]; } int front(){ return q[l]; } void pop_back(){ r--; } void push_back(int x){ q[++r]=x; } void pop_front(){ l++; } void clear(){ l=1,r=0; } int size(){ return r-l+1; } }; que q; void s1(){ for(int i=1;i<=n;i++)ok[i]=1; q.clear(); for(int i=1;i<n-2;i+=2){ while(!q.empty()&&s[q.back()]>=s[i])q.pop_back(); q.push_back(i); } for(int i=1;i<=n;i++){ int r=i+n-3; while(!q.empty()&&q.front()<i)q.pop_front(); if(r&1){ while(!q.empty()&&s[q.back()]>=s[r])q.pop_back(); q.push_back(r); } int res=s[q.front()]; // cout<<i<<" "<<r<<" "<<q.front()<<" "<<res<<endl; if(i&1){if(res+a[i]<s[i])ok[i]=0;} else if(res<s[i-1])ok[i]=0; // cout<<ok[i]<<endl; } q.clear(); for(int i=2;i<n-2;i+=2){ while(!q.empty()&&s[q.back()]>=s[i])q.pop_back(); q.push_back(i); } for(int i=1;i<=n;i++){ int r=i+n-3; while(!q.empty()&&q.front()<i)q.pop_front(); if(r&1^1){ while(!q.empty()&&s[q.back()]>=s[r])q.pop_back(); q.push_back(r); } int res=s[q.front()]; if(i&1){if(res<s[i-1])ok[i]=0;} else if(res+a[i]<s[i])ok[i]=0; } for(int i=1;i<=n;i++)ok[i+n]=ok[i]; for(int i=1;i<=n;i++){ if(a[i]<a[i+1])continue; if(!ok[i+2])ans[i]=0; int res=0; if(n&1)res=s[i+n-1]-s[i+2]+a[i+2]; else res=s[i+n-1]-s[i+1]; // cout<<i<<" "<<res<<" "<<a[i]-a[i+1]<<endl; if(res!=a[i]-a[i+1])ans[i]=0; } } void s2(){ // for(int i=1;i<=n+n;i++)cout<<s[i]<<" ";cout<<endl; for(int i=1;i<=n+n;i++)ok[i]=1; q.clear(); for(int i=n+n;i>n+3;i-=2){ while(!q.empty()&&s[q.back()]>=s[i])q.pop_back(); q.push_back(i); } for(int i=n+n;i>=n+1;i--){ int r=i-n+3; while(!q.empty()&&q.front()>i)q.pop_front(); if(r&1^1){ while(!q.empty()&&s[q.back()]>=s[r])q.pop_back(); q.push_back(r); } int res=s[q.front()]; // cout<<r<<" "<<i<<" "<<q.front()<<" "<<res<<endl; if(i&1){ if(res<s[i+1])ok[i]=0; } else if(res+a[i]<s[i])ok[i]=0; // cout<<ok[i]<<endl; } q.clear(); for(int i=n+n-1;i>n+3;i-=2){ while(!q.empty()&&s[q.back()]>=s[i])q.pop_back(); q.push_back(i); } for(int i=n+n;i>=n+1;i--){ int r=i-n+3; while(!q.empty()&&q.front()>i)q.pop_front(); if(r&1){ while(!q.empty()&&s[q.back()]>=s[r])q.pop_back(); q.push_back(r); } int res=s[q.front()]; // cout<<r<<" "<<i<<" "<<q.front()<<" "<<res<<endl; if(i&1){ if(res+a[i]<s[i])ok[i]=0; } else if(res<s[i+1])ok[i]=0; // cout<<ok[i]<<endl; } for(int i=1;i<=n;i++)ok[i]=ok[i+n]; for(int i=n+1;i<=n+n;i++){ if(a[i]>=a[i+1-n])continue; if(!ok[i-1])ans[i-n]=0; int res=0; if(n&1)res=s[i+2-n]-s[i-1]+a[i-1]; else res=s[i+2-n]-s[i]; // cout<<i<<" "<<res<<endl; if(res!=a[i+1-n]-a[i])ans[i-n]=0; } } void slv(){ read(n); for(int i=1;i<=n;i++)read(a[i]),a[i+n]=a[i]; if(n==2){ if(a[1]==a[2])cout<<"11"<<endl; else cout<<"00"<<endl; return; } if(n==3){ for(int i=1;i<=n;i++){ if(a[i]<a[i+1]){ if(a[i+1]-a[i]==a[i+2])cout<<1; else cout<<0; } else{ // cout<<a[i]<<" "<<a[i+1]<<" "<<a[i+2]<<endl; if(a[i]-a[i+1]==a[i+2])cout<<1; else cout<<0; } } return; } for(int i=1;i<=n+n;i++)s[i]=a[i]-s[i-1]; for(int i=1;i<=n;i++)ans[i]=1; s1(); for(int i=n+n;i>=1;i--)s[i]=a[i]-s[i+1]; s2(); for(int i=1;i<=n;i++)putchar(((int)ans[i])^48); } signed main(){ slv(); return 0; }