1. 程式人生 > 實用技巧 >Juggling Troupe 打表找規律

Juggling Troupe 打表找規律

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