社区讨论
?萌妹求调
P11267【MX-S5-T1】王国边缘参与者 3已保存回复 5
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 5 条
- 当前快照
- 1 份
- 快照标识符
- @m39uhtpo
- 此快照首次捕获于
- 2024/11/09 15:29 去年
- 此快照最后确认于
- 2025/11/04 15:03 4 个月前
WA on 14,妹妹球球大家看看哪里写挂了/ll
CPP#include<bits/stdc++.h>
#define int __int128
#define F(i,a,b) for(int i=a;i<=b;i++)
#define R(i,a,b) for(int i=a;i>=b;i--)
using namespace std;
const int N=2e5+7;
const int mod=1e9+7;
const int INF=1e18+7;
int n,m,q,f[N][65],num[N][65],bas2[N];
string s;
struct SGT{
int val;
}t[N*4];
inline int fr(){
int s=0,k=1;
char ch=getchar();
while(!isdigit(ch)){
if(ch=='-') k=-1;
ch=getchar();
}
while(isdigit(ch)){
s=(s<<3)+(s<<1)+ch-'0';
ch=getchar();
}
return s*k;
}
inline void fw(int x){
if(x>9) fw(x/10);
putchar((char)(x%10+'0'));
}
inline void pushup(int k){
if(t[k<<1|1].val!=INF){
t[k].val=t[k<<1|1].val;
}
else if(t[k<<1].val!=INF){
t[k].val=t[k<<1].val;
}
else{
t[k].val=INF;
}
}
inline void update(int now_l,int now_r,int l,int r,int k,int q){
if(l<=now_l&&r>=now_r){
if(q==1){
t[k].val=now_l;
}
else t[k].val=INF;
return ;
}
int mid=(now_l+now_r)>>1;
if(l<=mid) update(now_l,mid,l,r,k<<1,q);
if(r>mid) update(mid+1,now_r,l,r,k<<1|1,q);
pushup(k);
}
inline int query(int now_l,int now_r,int l,int r,int k){
if(l<=now_l&&r>=now_r){
return t[k].val;
}
int mid=(now_l+now_r)>>1,ans1=INF,ans2=INF;
if(l<=mid) ans1=query(now_l,mid,l,r,k<<1);
if(r>mid) ans2=query(mid+1,now_r,l,r,k<<1|1);
pushup(k);
if(ans2!=INF){
return ans2;
}
else if(ans1!=INF){
return ans1;
}
else return INF;
}
signed main(){
// freopen("a.txt","r",stdin);
// freopen("a.out","w",stdout);
n=fr(),m=fr(),q=fr();
cin>>s;
s=" "+s;
F(i,1,n*4){
t[i].val=INF;
}
bas2[0]=1;
F(i,1,65) bas2[i]=bas2[i-1]*2;
F(i,1,n){
update(1,n,i,i,1,s[i]-'0');
}
F(i,1,n){
int nw=(i+m)%n;
// int k=m/n;
// cout<<nw<<"\n";
if(nw<=0) nw+=n;
if(i+m>n){
int id1=query(1,n,1,nw,1);
int id2=query(1,n,i+1,n,1);
if(id1!=INF){
f[i][0]=id1;
// cout<<i<<" "<<id1<<" "<<"1\n";
num[i][0]=id1+n-i+(m-n+i-nw);
}
else if(id2!=INF&&(id1==INF||id2-i>=id1+n-i)){
f[i][0]=id2;
// cout<<i<<" "<<id2<<" "<<"2\n";
num[i][0]=id2-i+(m-nw+i-n);
}
else f[i][0]=(i+1)%n==0?1:(i+1)%n,num[i][0]=1;
}
else{
int id=query(1,n,i+1,nw,1);
// cout<<"id:"<<id<<"\n";
if(id!=INF){
num[i][0]=id-i;
}
else{
id=i+1;
num[i][0]=id-i;
}
f[i][0]=id;
}
}
F(i,1,63){
F(j,1,n){
num[j][i]=num[j][i-1]+num[f[j][i-1]][i-1];
num[j][i]%=mod;
f[j][i]=f[f[j][i-1]][i-1];
// cout<<num[j][i]<<" ";
// if(f[f[j][i-1]][i-1]==0){
// cerr<<j<<" "<<i<<"\n";
// }
}
// cout<<"\n";
}
// cerr<<1<<"\n";
F(b,1,q){
int s,k;
s=fr(),k=fr();
if(!k){
fw(s%mod);
putchar('\n');
continue;
}
int now=s,sum=now-(now%n==0?n:now%n);
sum%=mod;
now=now%n==0?n:now%n;
s=now;
R(i,63,0){
// cerr<<num[now][i]<<"\n";
if((k&(bas2[i]))!=0){
// if(b==1)
// cerr<<now<<" "<<num[now][i]<<" "<<f[now][i]<<"\n";
sum+=num[now][i];
sum%=mod;
now=f[now][i];
}
}
// if((s%n+sum)==3000){
// cerr<<s<<" "<<sum<<" "<<k<<" "<<b<<"\n";
// }
fw((s+sum)%mod);
putchar('\n');
}
return 0;
}
/*
5 7 3
01001
*/
回复
共 5 条回复,欢迎继续交流。
正在加载回复...