社区讨论

90 pts WA on #14 #15,求hack求调

P11267【MX-S5-T1】王国边缘参与者 3已保存回复 4

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
4 条
当前快照
1 份
快照标识符
@m3bl9h67
此快照首次捕获于
2024/11/10 20:46
去年
此快照最后确认于
2025/11/04 14:56
4 个月前
查看原帖
大样例全过了,调了好久找不到错。
CPP
#include <bits/stdc++.h>
#define int long long
#define MAXN 400005
#define INF 5000000000000000000
#define ls x<<1
#define rs x<<1|1
using namespace std;
const int mod = 1e9+7;
void chkmax(int &x,int y){
	x=y>x?y:x;
}
int pw(int a,int b)
{
	int t=a,ans=1;
	while(b)
	{
		if(b&1) ans=(ans*t);
		t=(t*t);
		b>>=1;
	}
	return ans;
}
int n,m,Q,s,k,a[MAXN];
int pre[MAXN],que[MAXN],head,tail,nxt[MAXN];
int st[MAXN][65];// 记录走 2^j 后的位置 mod n 
int len[MAXN][65];// 记录走 2^j 的长度  mod 1e9+7 
char ch;
int work(int _s,int _k)
{
	int s=(_s-1)%n+1,k=_k,ans=0;
	for(int i=62;i>=0;i--)
		if(k>=(1ll<<i))
		{
			k-=(1ll<<i);
			//cout<<i<<endl;
			ans+=len[s][i];
			ans%=mod;
			s=st[s][i];
		}
	return (_s%mod+ans%mod)%mod;
}
void solve0()
{
	while(Q--)
	{
		cin>>s>>k;
		cout<<(s%mod+k%mod)%mod<<'\n';
	}
}
void solve1()
{
	while(Q--)
	{
		cin>>s>>k;
		cout<<(s%mod+k%mod*(m%mod))%mod<<'\n';
	}
}
void solve()
{
	cin>>n>>m>>Q;
	int f1=0,f0=0;
	for(int i=1;i<=n;i++)
	{
		cin>>ch,a[i]=ch-'0';
		if(a[i]) f1=1;
		else f0=1;
	}
	if(!f1){solve0();return;}
	else if(!f0){solve1();return;}
	for(int i=1;i<=n;i++)
	{
		if(a[i])pre[i]=i;
		else pre[i]=pre[i-1];
	}
	head=1;tail=0;
	for(int i=n;i>=1;i--)
	{
		while(head<=tail&&que[head]>i+m) head++;
		if(head<=tail) nxt[i]=que[head];
		else nxt[i]=0;
		if(a[i])que[++tail]=i;
	}
	for(int i=1;i<=n;i++)
	{
		if(i+m<=n)
		{
			if(nxt[i])len[i][0]=nxt[i]-i,st[i][0]=nxt[i];
			else len[i][0]=1,st[i][0]=i%n+1;
		}
		else
		{
			int ceng=(m-(n-i+1))/n,wei=(i+m-1)%n+1-1;
			if(pre[wei])
			{
				len[i][0]=(pre[wei]+ceng%mod*(n%mod)+(n-i))%mod;
				st[i][0]=pre[wei];
			}
			else if(ceng)
			{
				assert(pre[n]>=1&&pre[n]<=n);
				len[i][0]=(pre[n]+(ceng-1)%mod*(n%mod))%mod;
				st[i][0]=pre[n];
			}
			else if(nxt[i]>=1&&nxt[i]<=n)
			{
				len[i][0]=nxt[i]-i;
				st[i][0]=nxt[i];
			}
			else len[i][0]=1,st[i][0]=i%n+1;
		}
	}
	for(int j=1;j<63;j++)
		for(int i=1;i<=n;i++)
		{
			st[i][j]=st[st[i][j-1]][j-1];
			len[i][j]=(len[i][j-1]+len[st[i][j-1]][j-1])%mod; // 取模  
		}
	while(Q--)
	{
		cin>>s>>k;
		cout<<(work(s,k)%mod+mod)%mod<<'\n';
	}
}
signed main()
{
//	freopen("kingdom5.in","r",stdin);
//	freopen("kingdom.out","w",stdout);
    ios::sync_with_stdio(0);cin.tie(0);
    int _T=1;//cin>>_T;
    while(_T--)solve();
    return 0;
}
/*
5 2 6
00100
5 1
5 2
5 3
5 4
5 5
5 6
*/

回复

4 条回复,欢迎继续交流。

正在加载回复...