社区讨论
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 条回复,欢迎继续交流。
正在加载回复...