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