蔡鸡求助
查看原帖
蔡鸡求助
105925
Kari5307_yu楼主2020/8/5 13:39

RT,珂朵莉树板子打挂了,照着第一篇题解学的,样例都没过,QAQ

#include<bits/stdc++.h>
#define int long long
using namespace std;
int seed;
struct node{
	int l,r;
	mutable int v;
	node(int L,int R=-1,int V=0):l(L),r(R),v(V){}
	bool operator<(const node& x) const{
		return l<x.l;
	}
};
set<node>s;
int rnd(){
	int qwq=seed;
	seed=(seed*7+13)%1000000007;
	return qwq;
}
set<node>::iterator split(int x){
	set<node>::iterator i=s.lower_bound(node(x));
	if(i!=s.end()&&i->l==x)return i;
	i--;
	int ll=i->l,rr=i->r,vv=i->v;
	s.erase(i);
	s.insert(node(ll,x-1,vv));
	return s.insert(node(x,rr,vv)).first;
}
void add(int l,int r,int val){
	set<node>::iterator ir=split(r+1),il=split(l);
	for(;il!=ir;il++)il->v+=val;
}
void assign(int l,int r,int v){
	set<node>::iterator ir=split(r+1),il=split(l);
	s.erase(il,ir);
	s.insert(node(l,r,v));
}
int rank(int l,int r,int k){
	vector<pair<int,int> >ve;
	set<node>::iterator ir=split(r+1),il=split(l);
	ve.clear();
	for(;il!=ir;il++)
		ve.push_back(pair<int,int>(il->v,il->r-il->l+1));
	sort(ve.begin(),ve.end());
	for(vector<pair<int,int> >::iterator i=ve.begin();i!=ve.end();i++){
		k-=i->second;
		if(k<=0)return i->first;
	}
	return -1;
}
int ksm(int a,int b,int md){
	int x=1;
	a%=md;
	while(b){
		if(b&1)x=x*x%md;
		a=a*a%md;
		b>>=1;
	}
	return x;
}
int sumpow(int l,int r,int n,int md){
	set<node>::iterator ir=split(r+1),il=split(l);
	int x=0;
	for(;il!=ir;il++)
		x=(x+(il->r-il->l+1)*ksm(il->v,n,md)%md)%md;
	return x;
}
signed main(){
	int n,m,vm;
	scanf("%lld%lld%lld%lld",&n,&m,&seed,&vm);
	for(int i=1;i<=n;i++)
		s.insert(node(i,i,(rnd()%vm)+1));
	s.insert(node(n+1,n+1,0));
	for(int i=1;i<=m;i++){
		int op=rnd()%4+1,l=rnd()%n+1,r=rnd()%n+1;
		if(l>r)swap(l,r);
		int x,y;
		if(op==3)x=rnd()%(r-l+1)+1;
		else x=rnd()%vm+1;
		if(op==4)y=rnd()%vm+1;
		if(op==1)add(l,r,x);
		else if(op==2)assign(l,r,x);
		else if(op==3)printf("%lld\n",rank(l,r,x));
		else printf("%lld\n",sumpow(l,r,x,y));
	}
	return 0;
}
2020/8/5 13:39
加载中...