样例全过,挂成45求调
查看原帖
样例全过,挂成45求调
541553
wangshi楼主2024/11/9 13:14
#include<bits/stdc++.h>
#define int long long
#define PII pair<int,int>
#define fi first
#define se second
#define sz(x) (int)(x.size())
#define all(x) x.begin(),x.end()
#define See_Memory cerr<<abs(&M1-&M2)/1024.0/1024.0<<"MB\n"
#define See_Time cerr<<(clock()-T)*1.0/CLOCKS_PER_SEC<<"s\n"
using namespace std;
const int N=2e5+10,mod=1e9+7;
bool M1;
mt19937 rng(time(0));
int n,m,q,sum[N]; 
vector<PII> g[N];
int f[N][61],h[N][61];
string s;
void Solve()
{
	cin>>n>>m>>q>>s; s=' '+s;
	for(int i=1;i<=n;++i) sum[i]=sum[i-1]+(s[i]-'0');
	for(int i=1;i<=n;++i)
	{
		int k=(m%n),l=1,r=n,ans=0; 
		if(i+k-1>=n)
		{
			r=k-(n-i);
			while(l<=r)
			{
				int mid=(l+r)>>1;
				if(sum[k-(n-i)]-sum[mid-1]) ans=mid,l=mid+1;
				else r=mid-1;	
			}						
		}
		if(!ans)
		{
			l=i+1,r=min(i+k,n);
			while(l<=r)
			{
				int mid=(l+r)>>1;
				if(sum[min(i+k,n)]-sum[mid-1]) ans=mid,l=mid+1;
				else r=mid-1;	
			}			
		}
		if(!ans) ans=(ans==n?1:i+1);
		f[i][0]=ans,h[i][0]=(n*(m/n)+(ans<i?ans+(n-i):(ans-i)))%mod;
	//	cerr<<i<<' '<<f[i][0]<<' '<<h[i][0]<<'\n'; 
	}
	for(int j=1;j<=60;++j)
	{
		for(int i=1;i<=n;++i)
		{
			f[i][j]=f[f[i][j-1]][j-1],h[i][j]=(h[i][j-1]+h[f[i][j-1]][j-1])%mod; 
		//	cout<<i<<' '<<j<<' '<<f[i][j]<<' '<<h[i][j]<<'\n';
		}
	}
	while(q--) 
	{
		int s,k,pos; cin>>s>>k; 
		pos=s%n; if(!pos) pos=n;
		for(int i=60;i>=0;--i)
		{
			if(k>=(1ll<<i))
			{
				s=(s+h[pos][i])%mod;
				pos=f[pos][i];
				k-=(1ll<<i);
			} 
		}
		cout<<s<<'\n'; 
	}
}
bool M2;
signed main()
{
//	freopen("kingdom.in","r",stdin);
//	freopen("kingdom.out","w",stdout);
	ios::sync_with_stdio(false); cin.tie(nullptr);
	int T=clock();
	int t=1; //cin>>t;
	while(t--) Solve();
	See_Memory; See_Time;
	return 0;
}

2024/11/9 13:14
加载中...