萌新刚学odt,第三个点wa掉了,求调
  • 板块学术版
  • 楼主bsTiat
  • 当前回复2
  • 已保存回复2
  • 发布时间2021/8/26 10:32
  • 上次更新2023/11/4 08:59:05
查看原帖
萌新刚学odt,第三个点wa掉了,求调
211086
bsTiat楼主2021/8/26 10:32

样例和一二两个点都是过的,第三个点莫名wa掉了,一看题目讨论区全是第三个点wa掉的,但没有一个有回复的,有没有大佬能指点一二

#include<bits/stdc++.h>
# define IT set<node>::iterator
# define N (100005)
using namespace std;
typedef long long ll;
ll n,m,seed,vmax;
ll a[N];
struct node{
	int l,r;
	mutable ll v;
	node(int L,int R=0,int V=0):l(L),r(R),v(V){}
	bool operator<(const node &x)const{
		return l<x.l;
	}
};
set<node>odt;
IT split(int p){
	IT it=odt.lower_bound(p);
	if(it!=odt.end()&&it->l==p)return it;
	it--;
	if(it->r<p)return odt.end();
	int l=it->l,r=it->r;
	ll v=it->v;
	odt.erase(it);
	odt.insert(node(l,p-1,v));
	return odt.insert(node(p,r,v)).first;	
}
void assign(int l,int r,int v){
	IT itr=split(r+1),itl=split(l);
	odt.erase(itl,itr);
	odt.insert(node(l,r,v));
	return;
}
void add(int l,int r,int v){
	IT itr=split(r+1),itl=split(l);
	for(;itl!=itr;itl++)
		itl->v+=v;
	return;
}
ll rnk(int l,int r,int k){
	vector<pair<ll,int> >v;
	IT itr=split(r+1),itl=split(l);
	for(;itl!=itr;itl++)
		v.push_back(make_pair(itl->v,(itl->r-itl->l+1)));
	for(vector<pair<ll,int> >::iterator i=v.begin();i!=v.end();i++){
		k-=i->second;
		if(k<=0)
			return i->first;
	}
}
ll pow(int x,int y,int m){
	ll r=1,base=x;
	while(y){
		if(y&1)
			r=(r*base)%m;
		base=(base*base)%m;
		y>>=1;
	}
	return r;	
}
ll sum(int l,int r,int x,int y){
	IT itr=split(r+1),itl=split(l);
	ll s=0;
	for(;itl!=itr;itl++)
		s=(s+(itl->r-itl->l+1)*pow(itl->v,x,y)%y)%y;
	return s;
}
inline ll rnd(){
	ll ret=seed;
	seed=(seed*7+13)%1000000007;
	return ret;
}
int main(){
	int i,j;
	int op,l,r;
	ll x,y;
	scanf("%d%d%d%d",&n,&m,&seed,&vmax);
	for(i=1;i<=n;i++){
		a[i]=rnd()%vmax+1;
		odt.insert(node(i,i,a[i]));
	}
	for(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()%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("%lld\n",rnk(l,r,x));
		if(op==4)
			printf("%lld\n",sum(l,r,x,y));
	}	
	return 0;
}

评测链接

2021/8/26 10:32
加载中...