1 solutions

  • 1
    @ 2023-11-10 11:20:27

    我们注意到,如果有一个区间的长度 2\ge 2,设这个区间的和为 xx,那么必定存在一个区间的和为 x2x-2

    这个结论是很好证的,设这个区间是 [l,r][l,r]

    • a[l]=2a[l]=2,那么区间 [l+1,r][l+1,r] 满足条件。
    • a[r]=2a[r]=2,那么区间 [l,r1][l,r-1] 满足条件。
    • a[l]=a[r]=1a[l]=a[r]=1,那么区间 [l+1,r1][l+1,r-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