求助ODT板子
查看原帖
求助ODT板子
242524
JRzyh楼主2020/6/24 19:52

样例没过,wtcl

可能压行有点难看,凑合看吧。

#include<bits/stdc++.h>
#define SIT set<node>::iterator
using namespace std;
long long ksm(long long a,int b, int mod)
{
	long long res=1,ans=a%mod;
	while(b)
	{
		if(b&1)res=res*ans%mod;
		ans=ans*ans%mod;
		b>>=1;
	}
	return res%mod;
}
int n;
struct node
{
	int l,r;
	mutable long long v;
	node(int L=1,int R=-1,long long V=0){l=L;r=R;V=v;}
	bool operator<(node b)const{return l<b.l;}
};
set<node>odt;
SIT spilt(int mid)
{
	SIT it=odt.lower_bound(node(mid));
	if(it!=odt.end()&&it->l==mid) return it;
	it--;
	node temp=*it;
	odt.erase(it);
	odt.insert(node(temp.l,mid-1,temp.v));
	return odt.insert(node(mid,temp.r,temp.v)).first;
}
void assign(int l,int r,long long val)
{
	SIT it1=spilt(l),it2=spilt(r+1);
	odt.erase(it1,it2);
	odt.insert(node(l,r,val));
}
void add(int l,int r,long long val)
{
	SIT it1=spilt(l),it2=spilt(r+1);
	for(SIT it=it1;it!=it2;it++) it->v+=val;
}
long long sum(int l,int r,int k,int mod)
{
	SIT it1=spilt(l),it2=spilt(r+1);
	long long res=0;
	for(SIT it=it1;it!=it2;it++)
	{
		res=(res+(ksm(it->v,k,mod)*(it->r-it->l+1)%mod))%mod;
		res%=mod;
	}
	return res%mod;
}
long long rank(int l,int r,int x)
{
	vector<pair<long long,int> >ay;
	ay.clear();
	SIT it1=spilt(l),it2=spilt(r+1);
	for(SIT it=it1;it!=it2;it++)ay.push_back(make_pair(it->v,it->r-it->l+1));
	sort(ay.begin(),ay.end());
	for(int i=0;i<ay.size();i++)
	{
		x-=ay[i].second;
		if(x<=0) return ay[i].first;
	}
	return -1;
}
long long seed;
long long rnd(){long long res=seed;seed=(seed*7+13)%1000000007;return res;}
long long vmax;
int m;
int main()
{
	cin>>n>>m>>seed>>vmax;
	for(int i=1;i<=n;i++)
	{
		long long x;
		x=(rnd()%vmax)+1;
		odt.insert(node(i,i,x));
	}
	odt.insert(node(n+1,n+1,0));
	for(int i=1;i<=m;i++)
	{
		short opt=(rnd()%4)+1;
		int l=(rnd()%n)+1,r=(rnd()%n)+1;
		if(l>r)swap(l,r);
		switch(opt)
		{
			case 1:
			{
				long long x=(rnd()%vmax)+1;
				add(l,r,x);
				break;
			} 
			case 2:
			{
				long long x=(rnd()%vmax)+1;
				assign(l,r,x);
				break;
			}
			case 3:
			{
				int x=(rnd()%(r-l+1))+1;
				cout<<rank(l,r,x)<<endl;
				break;
			}
			case 4:
			{
				long long x=(rnd()%vmax)+1,y=(rnd()%vmax)+1;
				cout<<sum(l,r,x,y)<<endl;
				break;
			}
		}
	}
	return 0;
}

禁止无意义回复

2020/6/24 19:52
加载中...