记一次灵异事件
  • 板块学术版
  • 楼主ZYStream
  • 当前回复2
  • 已保存回复2
  • 发布时间2025/1/23 11:31
  • 上次更新2025/1/23 14:27:21
查看原帖
记一次灵异事件
1419923
ZYStream楼主2025/1/23 11:31
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<typeinfo>
using namespace std;
#define ll long long

const int N=1e5+5;
const int logN=20;

ll cnt,t,st[N][logN],log[N];
ll q,mod;


int main(){
	cin>>q>>mod;
	for (int i=2;i<=1e5+5;i++) log[i]=log[i/2]+1;
	for (int v=1;v<=q;v++){
		cout<<v<<" "<<q<<endl;
		char s;
		ll x;
		cin>>s>>x;
		if (s=='A'){
			st[++cnt][0]=(x+t)%mod;
			if (cnt!=1){
				for (int j=1;cnt-(1<<j)+1>=1;j++){
					st[cnt][j]=max(st[cnt][j-1],st[cnt-(1<<(j-1))][j-1]);
				}
			}
		}
		else {
			ll k=log[x];
			t=max(st[cnt-x+1+(1<<k)-1][k],st[cnt][k]);
			cout<<t<<'\n';
		}
		cout<<v<<" "<<q<<endl;
	}
	return 0;
}

如上代码在读入以下数据时,q读成了16,循环了16次

5 100
A 96
Q 1
A 97
Q 1
Q 2

当我把代码从这样

ll q,mod;

改成这样之后

ll mod;
ll q;

读入q时,又奇迹般的读成了5,死改1小时,才发现是这段代码的问题

for (int i=2;i<=1e5+5;i++) log[i]=log[i/2]+1;

这段代码会越界,越界的值会赋给q,当我把q放下面时,越界的值会赋给mod

2025/1/23 11:31
加载中...