珂朵莉树RE求救(悬赏关注)
查看原帖
珂朵莉树RE求救(悬赏关注)
1285691
yinbe2楼主2024/3/14 19:38

经过二分找错,RE出现在assign函数中

#include<iostream>
#include<set>
#include<vector>
#include<algorithm>
using namespace std;
long long seed,vmax,a;
long long n,m;
long long x,y;
long long rnd()
{
	long long ret=seed;
	seed=(seed*7+13)%1000000007;
	return ret;
}
struct cun
{
	long long a,cnt;
	bool operator<(const cun &o)const
	{
		return a<o.a;
	}
};
struct tree
{
	long long l,r;
	mutable long long v;
	bool operator<(const tree &o)const
	{
		return o.l<l;
	}
};
set<tree>t;
auto split(int m)
{
	auto it=t.upper_bound({m,0,0});
	it--;
	if(m==it->l)return it;
	int l=it->l,r=it->r,v=it->v;
	t.erase(it);
	t.insert({l,m-1,v});
	return t.insert({m,r,v}).first;
}
void add(long long l,long long r,long long x)
{
	auto itr=split(r+1);
	auto itl=split(l);
	for(auto it=itl;it!=itr;it++)
	{
		it->v+=x;
	}
	return;
}
void assign(int l,int r,int v)
{
	auto itr=split(r+1);	
	auto itl=split(l);
	t.erase(itl,itr);//在此RE 
	t.insert({l,r,v});
}
long long _sort(long long l,long long r,long long x)
{
	auto itr=split(r+1);
	auto itl=split(l);
	vector<cun>v;
	for(auto it=itl;it!=itr;it++)
	{
		v.push_back({it->v,it->r-it->l+1});
	}
	sort(v.begin(),v.end());
	long long i;
	for(i=0;i<(int)(v.size());i++)
	{
		if(v[i].cnt<x)
		{
			x-=v[i].cnt;
		}
		else
		{
			break;
		}
	}
	return v[i].a;
}
long long quick_pow(long long a,long long b,long long p)
{
	a%=p;
	long long ans=1;
	while(b)
	{
		if(a&1)
		{
			ans*=a;
		}
		a=a*a%p;
		b>>=1;
	}
	return ans;
}
long long pow(long long l,long long r,long long b,long long p)
{
	auto itr=split(r+1);
	auto itl=split(l);
	long long ans=0;
	for(auto it=itl;it!=itr;it++)
	{
		ans+=(quick_pow(it->v,b,p)%p)*((it->r-it->l+1)%p)%p;
		ans%=p;
	}
	return ans;
}
int main()
{
	scanf("%lld%lld%lld%lld",&n,&m,&seed,&vmax);
	for(long long i=1;i<=n;i++)
	{
		a=rnd()%vmax+1;
		t.insert({i,i,a});
	}
	t.insert({n+1,n+1,0});
	while(m--)
	{
		long long flag=rnd()%4+1;
		long long l=rnd()%n+1;
		long long r=rnd()%n+1;
		if(l>r)swap(l,r);
		if(flag==3)x=rnd()%(r-l+1)+1;
		else x=rnd()%vmax+1;
		if(flag==4)y=rnd()%vmax+1;
		if(flag==1)add(l,r,x);
		else if(flag==2)assign(l,r,x);
		else if(flag==3)printf("%lld\n",_sort(l,r,x));	
		else printf("%lld\n",pow(l,r,x,y));
	}
	return 0;
}
2024/3/14 19:38
加载中...