珂爱代码求调
查看原帖
珂爱代码求调
663199
Tachibana27楼主2024/1/29 10:51
#include<bits/stdc++.h>
#define int long long
#define iit std::set<odt>::iterator
inline int read(){
   	int s=0;
   	int w=1;
   	char ch=getchar();
   	for(;ch<'0'||ch>'9';ch=getchar())
    	if(ch=='-')
			w=-1;
   	for(;ch>='0'&&ch<='9';ch=getchar())
		s=s*10+ch-'0';
   	return s*w;
}

void write(int x) {
	if(x<0){
    	putchar('-');
    	x=-x;
  	}
  	if(x>9)
    	write(x/10);
	putchar(x%10+'0');
	return;
}
class odt{
	public:
		int l,r;
		mutable int v;
		odt(int L=0,int R=-1,int V=0):l(L),r(R),v(V){}
		friend bool operator<(odt a,odt b){
			return a.l<b.l;
		} 
};//初始化(可以这么理解 
std::set<odt>s;
iit split(int pos){
	iit it=s.lower_bound(pos);
	if(it!=s.end()&&it->l==pos)
		return it;
	--it;
	if(pos>it->r)
		return s.end();
	int l=it->l,r=it->r,v=it->v;
	s.erase(it);
	s.insert(odt(l,pos-1,v));
	return s.insert(odt(pos,r,v)).first;
}//分裂 
void assign(int l,int r,int v){
	iit rr=split(r+1);
	iit ll=split(l);
	s.erase(ll,rr);
	s.insert(odt(l,r,v));
}//区间推平

int f(int l,int r,int v){
    iit ll=split(l);
	iit rr=split(r+1);
	int cnt=v;
    for(iit it=ll;it!=rr;it++){
		cnt-=((it->r)-(it->l)+1);
		if(cnt<=0)
			return (it->v);
	}
}
int qpow(int b,int p,int k){
	long long ans=1,tmp=b%k;
	tmp%=k;
	while(p>0){
		if(p&1)
			ans=ans*tmp%k;
		tmp=tmp*tmp%k;
		p=(p>>1);
	}
	return ans%k;
}
void add(int l,int r,int v){
    iit ll=split(l);
	iit rr=split(r+1);
    for(iit it=ll;it!=rr;it++)
		(it->v)+=v;
}
int qwq(int l,int r,int x,int y){
    iit ll=split(l);
	iit rr=split(r+1);
	int sum=0;
    for(iit it=ll;it!=rr;it++)
		sum+=qpow((it->v)%y,x,y)%y;
	return sum%y;
}
int n,m;
int seed;
int vmax;
int rd(){
	int ret=seed;
	seed=(seed*7+13)%1000000007;
//	std::cout<<seed<<"\n";
	return ret;
}
signed main(){
	n=read();
	m=read();
	seed=read();
	vmax=read();
	for(int i=1;i<=n;i++)
		s.insert((odt){i,i,rd()%vmax+1});
	while(m--){
		int op=rd()%4+1;
		int l=rd()%n+1;
		int r=rd()%n+1;
		int x=0;
		int y=0;
		if(l>r)
			std::swap(l,r);
		if(op==3)
			x=(rd()%(r-l+1))+1;
		else
			x=(rd()%vmax)+1;
		if(op==4)
			y=(rd()%(vmax))+1;
		if(op==1)
			add(l,r,x);
		if(op==2)
			assign(l,r,x);
		if(op==3){
			write(f(l,r,x));
			puts("");
		}
		if(op==4){
			write(qwq(l,r,x,y));
			puts("");
		}
	}
	return 0;
}

结果如下:

#3

Wrong Answer.wrong answer 1st numbers differ - expected: '375432604', found: '895750872'

2024/1/29 10:51
加载中...