累了,#3WA掉了
查看原帖
累了,#3WA掉了
264548
Tangent233楼主2021/6/18 21:51
#include<bits/stdc++.h>
#define IT set<node>::iterator
using namespace std;

long long quickpow(long long x,long long y,long long z)
{
	long long ans=1;
	while(y)
	{
		if(y&1) ans=(ans*x)%z;
		x=(x*x)%z;
		y>>=1;
	}
	return ans%z;
}

const int maxn=1e5+10;
struct node
{
	int l,r;
	mutable long long v;
	node(int L,int R=-1,long long V=0):l(L),r(R),v(V) {}
	bool operator<(const node& o) const
	{
		return l<o.l;
	}
};
set<node> s;
IT split(int pos)
{
	IT it=s.lower_bound(node(pos));
	if(it!=s.end()&&it->l==pos) return it;
	--it;
	int L=it->l,R=it->r;
	long long V=it->v;
	s.erase(it);
	s.insert(node(L,pos-1,V));
	return s.insert(node(pos,R,V)).first;
}
void assign(int l,int r,long long val=0)
{
	IT itr=split(r+1),itl=split(l);
	s.erase(itl,itr);
	s.insert(node(l,r,val));
}

void add(int l,int r,long long val=1)
{
	IT itr=split(r+1),itl=split(l);
	while(itl!=itr)
	{
		itl->v+=val;
		itl++;
	}
}
long long rank1(int l,int r,int k)
{
	vector< pair<long long,int> > vp;
	IT itr=split(r+1),itl=split(l);
	vp.clear();
	while(itl!=itr)
	{
		vp.push_back(pair<long long,int>(itl->v,itl->r - itl->l + 1));
		itl++;
	}
	sort(vp.begin(),vp.end());
	for(vector< pair<long long,int> >::iterator it=vp.begin();it!=vp.end();++it)
	{
		k-=(it->second);
		if(k<=0) return it->first;
	}
	return -1LL;
}
long long sumt(int l,int r,int ex,int mod)
{
	IT itr=split(r+1),itl=split(l);
	long long res=0;
	while(itl!=itr)
	{
		res=(res+(long long)(itl->r - itl->l +1)*quickpow(itl->v , (long long)(ex) , (long long)(mod)))%mod;
		itl++;
	}
	return res;
}

int n,m;
long long seed,valmax;
const int mmod=1e9+7;
int random()
{
	long long ret=seed;
	seed=(seed*7+13)%(mmod);
	return ret;
}
long long numlist[maxn];
int main()
{
	scanf("%d %d %d %d",&n,&m,&seed,&valmax);
	for(int i=1;i<=n;i++)
	{
		numlist[i]=(random()%valmax)+1;
		s.insert(node(i,i,numlist[i]));
	}
	for(int i=1;i<=m;i++)
	{
		int op=(random()%4)+1,l=(random()%n)+1,r=(random()%n)+1;
		if(l>r) swap(l,r);
		int x,y;
		if(op==3) x=(random()%(r-l+1))+1;
		else x=(random()%valmax)+1;
		if(op==4) y=(random()%valmax)+1;
		
		if(op==1) add(l,r,x);
		else if(op==2) assign(l,r,x);
		else if(op==3) printf("%lld\n",rank1(l,r,x));
		else printf("%lld\n",sumt(l,r,x,y));
	}
	return 0;
}

https://www.luogu.com.cn/record/51893938

呜呜

2021/6/18 21:51
加载中...