MnZn刚学珂朵莉一秒钟莫名TLE调崩溃了求救
查看原帖
MnZn刚学珂朵莉一秒钟莫名TLE调崩溃了求救
378706
MoyunAllgorithm楼主2023/7/20 22:18
#include <bits/stdc++.h>
#define LL long long
#define int long long
using namespace std;
const int MAXN=1e5+5;
const int MOD=1e9+7;
int col=0;
struct Chtholly
{
	int nxt=-1;
	int l,r;
	int c;
	bool operator<(const Chtholly &j) const
	{
		return c<j.c;
	}
}odt[MAXN<<1];
int hd=1,tot;
int N,M,seed,vmax;
int a[MAXN];
inline int Rand()
{
	int res=seed;
	seed=(1ll*seed*7+13)%MOD;
//	printf("RAND %lld ")
	return res;
}
inline int Split(int x)
{
	for(int i=1;i!=-1;i=odt[i].nxt)
	{
	//	printf("Splitting... %lld %lld %lld %lld\n",i,x,odt[i].l,odt[i].r);
		if(odt[i].l==x) return i; 
		if(odt[i].l<x&&odt[i].r>=x)
		{
			odt[++tot]={odt[i].nxt,x,odt[i].r,odt[i].c};
			odt[i].nxt=tot;
			odt[i].r=x-1;
			return odt[i].nxt;
		}
	}
	return -1;
}
void Add(int bl,int br,int x)
{
	for(int i=bl;i!=br;i=odt[i].nxt)  odt[i].c+=x;
	return;
}
void Assign(int bl,int br,int x)
{
	if(br==-1) odt[bl].r=N;
	else odt[bl].r=odt[br].l-1;
	odt[bl].c=x;
	odt[bl].nxt=br;
	return;
}
int QPow(LL base,int po,LL mod)
{
	LL res=1;
	while(po)
	{
		if(po&1) res=res%mod*(base)%mod;
		base=base%mod*(base)%mod;
		po>>=1;
	}
	return (int)res%mod;
}
int Value(int bl,int br,int k)
{
	vector<Chtholly>vec;
	vec.clear();
	for(int i=bl;i!=br;i=odt[i].nxt) vec.push_back(odt[i]);
	sort(vec.begin(),vec.end());
	k--;
	for(auto i:vec)
	{
		int len=i.r-i.l+1;
		k-=len;
		if(k<0) return i.c;
	}
	return -1;
}
int PowSum(int bl,int br,int x,int y)
{
	LL res=0;
	for(int i=bl;i!=br;i=odt[i].nxt) 
	{
		res=res+1ll*(odt[i].r-odt[i].l+1)*QPow(odt[i].c%y,x,y)%y;
	//	printf("[MOD%lld] %lld %lld %lld %lld %lld\n",y,i,odt[i].nxt,odt[i].r-odt[i].l+1,odt[i].c,QPow(odt[i].c,x,y));
		res%=y;
	}
	return res;
}
signed main()
{
	scanf("%lld %lld %lld %lld",&N,&M,&seed,&vmax);
	for(int i=1;i<=N;i++) 
	{
		a[i]=(Rand()%vmax)+1;
		odt[i]={i+1,i,i,a[i]};
		odt[N].nxt=-1;
	//	printf("%d ",a[i]);
	}
//	puts("");
	tot=N;
	while(M--)
	{
		int opt,l,r,x;
		opt=Rand()%4+1,l=Rand()%N+1,r=Rand()%N+1;
		if(l>r) swap(l,r);
		x=opt==3?Rand()%(r-l+1)+1:Rand()%vmax+1;
	//	printf("OPERATION%lld %lld %lld %lld\n",opt,l,r,x);
		int br=Split(r+1),bl=Split(l);
	//	printf("SPLIT%lld %lld\n",bl,br);
		if(opt==1) Add(bl,br,x);
		if(opt==2) Assign(bl,br,x);
		if(opt==3) printf("%lld\n",Value(bl,br,x));
		if(opt==4) printf("%lld\n",PowSum(bl,br,x,Rand()%vmax+1));
	}
	return 0;
}
2023/7/20 22:18
加载中...