1 solutions
-
1
我们注意到,如果有一个区间的长度 ,设这个区间的和为 ,那么必定存在一个区间的和为 。
这个结论是很好证的,设这个区间是 。
- ,那么区间 满足条件。
- ,那么区间 满足条件。
- ,那么区间 满足条件。
那么我们求出最大奇数的区间,最大偶数的区间,然后类似证明地删除即可。
#include<bits/stdc++.h> #define int long long using namespace std; int n,m,a[2000005],sum1,sum2,pos1=-1,pos2=-1,sum[2000005],x; string s; pair<int,int> ans[3000005]; signed main(){ cin>>n>>m>>s; for(int i=0;i<s.size();i++)a[i+1]=(s[i]=='W')?1:2,sum[i+1]=sum[i]+a[i+1]; sum1=sum[n]; ans[sum1]={1,n}; for(int i=1;i<=n;i++)if(a[i]==1){ pos1=i; break; } for(int i=n;i;i--)if(a[i]==1){ pos2=i; break; } if(pos1!=-1&&pos2!=-1){ int aa=pos1,bb=n-pos2+1; if(aa>bb)sum2=sum[pos2-1],ans[sum2]={1,pos2-1}; else sum2=sum[n]-sum[pos1],ans[sum2]={pos1+1,n}; } int l1=ans[sum1].first,r1=ans[sum1].second,l2=ans[sum2].first,r2=ans[sum2].second; while(sum1>0){ sum1-=2; if(a[l1]==2)l1++,ans[sum1]={l1,r1}; else if(a[r1]==2)r1--,ans[sum1]={l1,r1}; else l1++,r1--,ans[sum1]={l1,r1}; } while(sum2>0){ sum2-=2; if(a[l2]==2)l2++,ans[sum2]={l2,r2}; else if(a[r2]==2)r2--,ans[sum2]={l2,r2}; else l2++,r2--,ans[sum2]={l2,r2}; } while(m--){ cin>>x; if(ans[x].first==0&&ans[x].second==0)cout<<"NIE\n"; else cout<<ans[x].first<<" "<<ans[x].second<<"\n"; } return 0; }
- 1
Information
- ID
- 2573
- Time
- 1000ms
- Memory
- 125MiB
- Difficulty
- 5
- Tags
- # Submissions
- 2
- Accepted
- 2
- Uploaded By