80分TLE了4个点
查看原帖
80分TLE了4个点
1252534
mc_nxd楼主2024/11/9 19:50
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <cctype>
using namespace std;
#define int long long
int read(){
	int s=0,w=1;char ch=getchar();
	while(!isdigit(ch)){
		if(ch=='-')w=-1;
		ch=getchar();
	}
	while(isdigit(ch)){
		s=s*10+ch-'0';
		ch=getchar();
	}
	return s*w;
}
const int mod=1e9+7;
int n,m,q,s,k;
string S;
int sum[500010];
__int128 nxt[500010][100];
int cnt0=1,cnt1=1;//是否全0或全1
int ask(int x){
	return sum[x%n]+sum[n]*(x/n);
}
int query(int l,int r){
	return ask(r)-ask(l-1);
}
int f(__int128 x){
	return x%n==0?n:x%n;
}
signed main(){
	cin>>n>>m>>q;
	cin>>S;
	S=" "+S+S;
	//-----------****特殊性质****-----------
//	for(int i=1;i<=n;i++){
//		cnt0&=(S[i]=='0');
//		cnt1&=(S[i]=='1');
//	}
//	if(cnt0){
//		while(q--){
//			cin>>s>>k;
//			printf("%lld\n",(s+k)%mod);
//		}
//		return 0;
//	}
//	if(cnt1){
//		while(q--){
//			cin>>s>>k;
//			printf("%lld\n",(s+m*k)%mod);
//		}
//		return 0;
//	}
	//-----------****特殊性质****-----------
	for(int i=1;i<=n*2;i++){
		sum[i]=sum[i-1]+(S[i]=='1');
	}
	for(int i=1;i<=n;i++){
		int l=i+1,r=i+m;
		while(l<r){
			int mid=l+r>>1;
			if(query(mid+1,i+m)>=1){
				l=mid+1;
			}
			else{
				r=mid;
			}
		}
		if(query(l,l)>=1){
			nxt[i][0]=l-i;
		}
		else{
			nxt[i][0]=1;
		}
	}
	for(int j=1;j<=62;j++){
		for(int i=1;i<=n;i++){
			nxt[i][j]=(nxt[i][j-1]+nxt[f(i+nxt[i][j-1])][j-1]);
		}
	}
	while(q--){
		cin>>s>>k;
		int ans=s%mod;
		for(int i=62;i>=0;i--){
			if(k&(1ll<<i)){
				s%=n;
				if(s==0){
					s=n;
				}
				ans=(ans+nxt[s][i]%mod)%mod;
				s+=nxt[s][i]%n;
			}
		}
		printf("%lld\n",ans);
	}
	return 0;
}

图片版:

#测试点信息

在这种情况下: #测试点信息
如果将代码中注释的地方去掉的话:测试点信息

2024/11/9 19:50
加载中...