1 条题解

  • 0
    @ 2023-9-15 16:59:55

    image

    #include <bits/stdc++.h>
    #define ll long long
    using namespace std;
    const int N=205;
    int n,m,k,s,t,sum[N],R[N],L[N];
    char c[N<<1],d[N];
    int f[N][20],_f[N][20],log2n;
    ll g[N][20],_g[N][20];
    int main(){
    	cin>>n>>m;
    	cin>>c+1;
    	for (int i=1;i<=2*n;++i)
    		if (c[i]=='L') ++s;
    		else R[++t]=s;
    	R[n]=n+1;s=t=n+1;
    	for (int i=2*n;i>=1;--i)
    		if (c[i]=='R') --s;
    		else L[--t]=s; 
    	L[1]=0;cin>>d+1;
    	for (int i=1;i<=n;++i) sum[i]=sum[i-1]+(d[i]=='1');
    	for (int i=1;i<=n;++i) {
    		f[i][0]=R[i];_f[i][0]=L[i];
    		g[i][0]=sum[R[i]];
    		if (L[i]>=1) _g[i][0]=sum[L[i]-1];
    	}
    	f[n+1][0]=n+1;g[0][0]=0;
    	log2n=log2(n);
    	for (int j=1;j<=log2n;++j){
    		for (int i=n+1;i>=1;--i){
    			f[i][j]=f[f[i][j-1]][j-1];
    			g[i][j]=g[i][j-1]+g[f[i][j-1]][j-1];
    		}
    		for (int i=1;i<=n;++i){
    			_f[i][j]=_f[_f[i][j-1]][j-1];
    			_g[i][j]=_g[i][j-1]+_g[_f[i][j-1]][j-1];
    		}
    	}
    	ll ans1,ans2;
    	for (int i=1;i<=m;++i){
    		cin>>s>>t;
    		ans1=0;ans2=sum[s]-sum[s-1]+sum[t]-sum[t-1];
    		for (int j=log2n;j>=0;--j){
    			if (f[s][j]<t){
    				ans1+=(1<<j);
    				ans2+=g[s][j];
    				s=f[s][j];
    			}	
    		}
    		cout<<ans1+1<<' ';
    		for (int j=0;ans1;ans1>>=1,++j)
    			if (ans1&1) {ans2-=_g[t][j];t=_f[t][j];}  
    		cout<<ans2<<"\n";
    	}
    } 
    
    
    
    
    • 1

    信息

    ID
    504
    时间
    4000ms
    内存
    512MiB
    难度
    8
    标签
    递交数
    22
    已通过
    6
    上传者