2018 Multi-University Training Contest 1——1010.Turn Off The Light

规律:如果从1开始往右走的话,如果从(1~i)经过的零的个数和有奇数个零的话(那么i与下个数必定要有一个来回),可以手动模拟样例。

#include 
using namespace std;
typedef long long LL;

const int N=1010000;
const int mod = 1e9+7;
int n,T;
bool f[N],g[N],preg[N],preg2[N];
char s[N];
int ret[N],ret2[N],cnt[N],cnt2[N];
void work(bool *g,int *ret,int n) {
	for(int i = 1; i <= n; i++) ret[i]=1<<30;
	int fo=n+1,lo=-1;
	for(int i = 1; i <= n; i++) {
		if (g[i]) {
			if (fo==n+1) fo=i;
			lo=i;
		}
	}
	if (fo>lo) {
		for(int i = 1; i <= n; i++) ret[i]=0;
		return;
	}
	for(int i = 1; i <= n; i++) {
	    //preg前缀0的个数是奇数(1)还是偶数(0)
        //preg2前缀1的个数是奇数(1)还是偶数(0)
        //cnt[i]为[1,i]中preg为奇数的位置的个数
        //cnt2[i]为[1,i]中preg2为奇数的位置的个数
		preg[i]=preg[i-1]^g[i]^1;
		preg2[i]=preg2[i-1]^g[i];
		cnt[i]=cnt[i-1]+preg[i];
		cnt2[i]=cnt2[i-1]+preg2[i];
	//	cout<

 

你可能感兴趣的:(思维)