Juggling Troupe 打表找規律
阿新 • • 發佈:2020-10-05
Juggling Troupe 打表找規律
題解:
這個居然是一個打表找規律的題目,不可思議,這個規律好難找。。。
規律: 如果第 i 個位置是2,找到左邊離它最近的0 設為L,找到右邊離它最近的0 設為 R,
那麼對於區間 [L,R] ,位置 L+R-i 的數字變成0,其他都是1
又發現每個2是獨立的,即每個2可以不同時扔球,可以分開處理。所以最終的解法就是按照只有一個2的解法解決每個2即可。(這裡有點不理解。。。)
#include <bits/stdc++.h> using namespace std; const int maxn = 1e6+10; int pre[maxn],last[maxn],cnt1,cnt2,ans[maxn]; char s[maxn]; int main(){ scanf("%s",s+1); int n = strlen(s+1); last[0] = n+1; cnt1 = cnt2 = 0; for(int i=n;i>=1;i--){ ans[i] = 1; if(s[i]=='0') last[++cnt2] = i; } for(int i=1;i<=n;i++){ if(s[i]=='2'){ int j = pre[cnt1]+last[cnt2]-i; if(cnt1) --cnt1; if(cnt2) --cnt2; if(j>i) last[++cnt2] = j; else pre[++cnt1] = j; } else if(i==last[cnt2]) pre[++cnt1] = last[cnt2--]; } for(int i=1;i<=cnt1;i++) ans[pre[i]] = 0; for(int i=1;i<=n;i++) printf("%d", ans[i]); printf("\n"); }