40pts求调
查看原帖
40pts求调
558747
White_Chocolate楼主2024/11/9 16:50

rt

测评记录:here +第四个样例过不了

code:

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e5*2+10,mod=1e9+7;
int stp[N][20],logn[N];
int n,m,T,st,k;
string s;
inline int query(int l,int r){
	if(r<l)	return 0;
	int lp=logn[r-l+1];
	return max(stp[l][lp],stp[r-(1<<lp)+1][lp]);
}
struct nodeskip{
	int to,val;//val: skip几步 
};
nodeskip stskip[N][62];
inline int read(){
	char c=getchar();
	int s=0,f=1;
	while(c<'0'||c>'9'){if(c=='-')	f=-1; c=getchar();}
	while(c>='0'&&c<='9'){s=s*10+c-'0';c=getchar();}
	return s*f;
}
inline void solve(){
	int rst=st,cnt=0,ans=0;
	if(st%n==0)	st=n;
	else st=st-(st/n)*n;
	while(k){
		if(k%2){
			ans=(ans+stskip[st][cnt].val)%mod;
			st=stskip[st][cnt].to;
		}
		cnt++;
		k/=2;
	}
	cout<<(rst%mod+ans%mod)%mod<<"\n";
}
signed main(){
//	freopen("kingdom4.in","r",stdin);
//	freopen("ans.txt","w",stdout);
	n=read();m=read();T=read();
	cin>>s;
	s=' '+s;
	for(int i=2;i<=n;i++) logn[i]=logn[i>>1]+1;
	for(int i=1;i<=n;i++)
		stp[i][0]=(s[i]=='1' ? i : 0);
	for(int j=1;j<=logn[n];j++){
		for(int i=1;i+(1<<j)<=n+1;i++){
			stp[i][j]=max(stp[i][j-1],stp[i+(1<<(j-1))][j-1]);
		}
	}
	int skp=0;	
	if(m>n){
		if(m%n==0){
			skp=((m/n-1)*n)%mod;
			m=n;
		}
		else{
			skp=((m/n)*n)%mod;
			m=m-(m/n)*n;
		}
	}
	for(int res=0,i=1;i<=n;i++){
		if(i+m>n){
			res=query(1,i+m-n);
			if(res){
				stskip[i][0].to=res;
				stskip[i][0].val=((res+n-i)%mod+skp)%mod;
				res=query(i+1,n);
			}
			else{
				if(!res){
					stskip[i][0].to=(i+1>n ? 1 : i+1);
					stskip[i][0].val=(1+skp)%mod;
				}
				else{
					stskip[i][0].to=res;
					stskip[i][0].val=((res-i)%mod+skp)%mod;
				}
			}
		}
		else{
			res=query(i+1,i+m);
			if(!res){
				stskip[i][0].to=(i+1>n ? 1 : i+1);
				stskip[i][0].val=(skp+1)%mod;
			}
			else{
				stskip[i][0].to=res;
				stskip[i][0].val=((res-i)+skp)%mod;
			}
		}
	}
	for(int j=1;j<=61;j++){
		for(int nto,i=1;i<=n;i++){
			nto=stskip[i][j-1].to;
			stskip[i][j].to=stskip[nto][j-1].to;
			stskip[i][j].val=(stskip[i][j-1].val+stskip[nto][j-1].val)%mod;
		}
	}//init
	while(T--){
		st=read();k=read();
		solve();
	}
	return 0;
}
2024/11/9 16:50
加载中...