BZOJ 2217: [Poi2011]Lollipop

若sum可行 sum-2一定可行

序列和为ans

找出和ans奇偶性不同的最大的ans,即最靠左或最靠右的1的位置

更新答案

有spj

#include<cstdio>
using namespace std;
int L[2000005],R[2000005],a[2000005];
char s[2000005];
void calc(int l,int r,int ans){
	while (ans>0){
		L[ans]=l,R[ans]=r;
		if (a[l]==2) l++;
		else if (a[r]==2) r--;
		else l++,r--;
		ans-=2;
	}
}
int main(){
	int n,m;
	scanf("%d%d",&n,&m);
	scanf("%s",s+1);
	for (int i=1; i<=n; i++)
		if (s[i]=='W') a[i]=1;
		else a[i]=2;
	int ans=0;
	for (int i=1; i<=n; i++) ans+=a[i];
	calc(1,n,ans);
	int idl=0,idr=0;
	for (int i=1; i<=n; i++) if (a[i]==1) {
		idl=i;
		break;
	}
	for (int i=n; i>=1; i--) if (a[i]==1) {
		idr=i;
		break;
	}
	if (idl){
		if (idl<=n-idr+1) calc(idl+1,n,ans-idl*2+1);
		else calc(1,idr-1,ans-(n-idr+1)*2+1);
	}
	while (m--){
		int x;
		scanf("%d",&x);
		if (!L[x]) printf("NIE\n");
		else printf("%d %d\n",L[x],R[x]);
	}
	return 0;
}

  

 

posted @ 2018-11-03 20:28  ~Silent  阅读(133)  评论(0编辑  收藏  举报
Live2D