ODTwa#3求调
查看原帖
ODTwa#3求调
209923
PRIMITIVE_LIGHTS楼主2022/3/11 21:50
#include<iostream> 
#include<set>
#include<vector>
#include<algorithm>
#define int long long
#define IT set<node>::iterator
using namespace std;
int n,m;
int seed;
int vmax;
int a[1000001];
struct node{
	int l,r;mutable int val;
	node(int L=0,int R=0,int VAL=0){l=L,r=R,val=VAL;}
	 bool operator <(const node &b) const{return l<b.l;} 
};
set <node> ODT;
IT split(int pos){
	IT p=ODT.lower_bound((node){pos,pos,0});
	if(p!=ODT.end()&&p->l==pos) return p;
	--p;
	int v=p->val;
	int R=p->r;
	int L=p->l;
	ODT.erase(p);
	ODT.insert((node){L,pos-1,v});
	return ODT.insert((node){pos,R,v}).first;
}
void assign(int l,int r,int k){
	IT pos2=split(r+1),pos1=split(l);
	ODT.erase(pos1,pos2);
	ODT.insert((node){l,r,k});
}
void add(int l,int r,int k){
	IT pos2=split(r+1),pos1=split(l);
	for(IT it=pos1;it!=pos2;++it)	it->val+=k;
}
int kth(int l,int r,int k){
	IT pos2=split(r+1),pos1=split(l);
	vector<node> P;P.clear();
	int cnt=0;
	for(IT it=pos1;it!=pos2;++it) {
		P.push_back(*it);
	}
	sort(P.begin(),P.end());
	for(auto it:P){
		cnt+=(it.r-it.l+1);
		if(cnt>=k) return it.val;
	}
	return 0;
}
int ksm(int base,int p,int mod){
	base%=mod;
	int ans=1;
	while(p){
		if(p&1) ans=(ans*base)%mod;
		base=(base*base)%mod;
		p>>=1;
	}
	return ans;
}
int ask_pow(int l,int r,int k,int y){
	IT pos2=split(r+1),pos1=split(l);
	int cnt=0;
	for(IT it=pos1;it!=pos2;++it){
		cnt+=((it->r-it->l+1)*ksm(it->val,k,y))%y;
		cnt%=y;
	}
	return cnt;
}
int rnd(){
	int ret=seed;
	seed=(seed*7+13)%1000000007;
	return ret;
}
void getin(){
	for(int i=1;i<=n;i++){
		a[i]=(rnd()%vmax)+1;
	}
	for(int i=1;i<=n;i++){
		ODT.insert((node){i,i,a[i]});
	}
//	ODT.insert((node){n+1,n+1,0});
	for(int i=1;i<=m;i++){
		int op,l,r,x,y;
		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()%vmax)+1;
		if(op==4) y=(rnd()%vmax)+1;
		if(op==1){
			add(l,r,x);
		}
		if(op==2){
			assign(l,r,x);
		}
		if(op==3){
			printf("%d\n",kth(l,r,x));
		}
		if(op==4){
			printf("%d\n",ask_pow(l,r,x,y));
		}
	}
}
signed main(){
	cin>>n>>m>>seed>>vmax;
	getin();
}

自闭了。 试过了快速幂模底数,也加上了longlong 求调,万分感谢

2022/3/11 21:50
加载中...