WA on #6求条
查看原帖
WA on #6求条
1025958
511_Juruo_wyk楼主2024/10/20 13:06

CodeForces上交的,显示第 66 个点寄了。

蒟蒻第一次用 CodeForces,有点不会用,不明白 CodeForces 返回 “Probably, the solution is executed with error 'signed integer overflow' on the line 43”是啥意思,还请大佬指点一下,谢谢。

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1e5+5;
struct node{
	int l,r;
	mutable int v;
};
typedef set<node>::iterator sti;
bool operator<(node a,node b){
	return a.l<b.l;
}
set<node>s;
int a[N],n,m,seed,mod,op,l,r,x,y;
int rnd(){
	int ret=seed;
	seed=(seed*7+13)%1000000007;
	return ret;
}
sti split(int pos){
	sti k=s.lower_bound(node{pos,0,0});
	if(k!=s.end()&&k->l==pos)return k;
	k--;
	int l=k->l,r=k->r,v=k->v;
	s.erase(k);
	s.insert(node{l,pos-1,v});
	return s.insert(node{pos,r,v}).first;
}
void add(int l,int r,int k){
	sti re=split(r+1);
	sti le=split(l);
	for(sti i=le;i!=re;i++)
		i->v+=k;
}
void merge(int l,int r,int k){
	sti re=split(r+1);
	sti le=split(l);
	s.erase(le,re);
	s.insert(node{l,r,k});
}
int qpow(int x,int y,int m){
	if(y==0)return 1;
	if(y&1)return x*qpow(x,y-1,m)%m;//这一行(43行)被标红了
	else{
		int k=qpow(x,y>>1,m);
		return k*k%m;
	}
}
int ask(int l,int r,int x){
	sti re=split(r+1);
	sti le=split(l);
	map<int,int>mp;
	for(sti i=le;i!=re;i++)
		mp[i->v]+=(i->r)-(i->l)+1;
	int cnt=0;
	for(auto i:mp){
		cnt+=i.second;
		if(cnt>=x)return i.first;
	}
}
int powsum(int l,int r,int x,int y){
	sti re=split(r+1);
	sti le=split(l);
	int ans=0;
	for(sti i=le;i!=re;i++)
		ans=(ans+qpow(i->v,x,y)*((i->r)-(i->l)+1)%y)%y;
	return ans;
}
signed main(){
	cin>>n>>m>>seed>>mod;
	for(int i=1;i<=n;i++){
		a[i]=rnd()%mod+1;
		s.insert(node{i,i,a[i]});
	}
	for(int i=1;i<=m;i++){
		op=rnd()%4+1;
		l=rnd()%n+1;
		r=rnd()%n+1;
		if(l>r)swap(l,r);
		if(op==3)x=rnd()%(r-l+1)+1;
		else x=rnd()%mod+1;
		if(op==4)y=rnd()%mod+1;
		if(op==1)add(l,r,x);
		if(op==2)merge(l,r,x);
		if(op==3)cout<<ask(l,r,x)<<'\n';
		if(op==4)cout<<powsum(l,r,x,y)<<'\n';
	}
	return 0;
}
2024/10/20 13:06
加载中...