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("
");
}