10分求调
查看原帖
10分求调
217634
anonymous217楼主2023/8/24 15:11
#include<iostream>
#include<stack>
#define int long long
using namespace std;
const int N=2e6+5;
int n,m,type,sum[N],L[N],R[N],dp1[N],dp2[N],sum1[N],sum2[N],mini[N][30],pos[N][30],lg[N];
namespace gen{
	typedef unsigned long long ull;
	ull s,a,b,c,lastans=0;
	ull rand(){
		//cout<<s<<" "<<a<<" "<<b<<" "<<c<<" "<<lastans<<" "<<(a+b*lastans)%c<<"\n";
		return s^=(a+b*lastans)%c;
	}
};
stack<int>stk;
void init_stack()
{
	for(int i=1;i<=n;i++)
	{
		while(!stk.empty()&&sum[i]<sum[stk.top()])
		{
			R[stk.top()]=i;
			stk.pop();
		}
		stk.push(i);
	}
	while(!stk.empty())
	{
		R[stk.top()]=n+1;
		stk.pop();
	}
	for(int i=n;i>=1;i--)
	{
		while(stk.empty()==false&&sum[i]<sum[stk.top()])
		{
			L[stk.top()]=i;
			stk.pop();
		}
		stk.push(i);
	}
	while(!stk.empty())
	{
		L[stk.top()]=0;
		stk.pop();
	}
}
void init_dp()
{
	for(int i=1;i<=n;i++)
	{
		dp1[i]=dp1[L[i]]+sum[i]*(i-L[i]);
		sum1[i]=sum1[i-1]+dp1[i];
	}
	for(int i=n;i>=1;i--)
	{
		dp2[i]=dp2[R[i]]+sum[i]*(R[i]-i);
		sum2[i]=sum2[i+1]+dp2[i];
	}
	return;
}
void init_rmq()
{
	for(int i=1;i<=n;i++)
	{
		mini[i][0]=sum[i],pos[i][0]=i;
	}
	for(int j=1;(1<<j)<=n;j++)
	{
		for(int i=1;i+(1<<j)-1<=n;i++)
		{
			if(mini[i][j-1]<=mini[i+(1<<j-1)][j-1])
				mini[i][j]=mini[i][j-1],pos[i][j]=pos[i][j-1];
			else
				mini[i][j]=mini[i+(1<<j-1)][j-1],pos[i][j]=pos[i+(1<<j-1)][j-1];
		}
	}
	return;
}
signed main()
{
	cin>>n>>m>>type;
	lg[0]=-1;
	for(int i=1;i<=n;i++)
	{
		lg[i]=lg[i/2]+1;
	}
	for(int i=1;i<=n;i++)
	{
		cin>>sum[i];
	}
	init_stack();init_dp();init_rmq();
	unsigned long long tmp,ans=0;int x,y;
	if(type==0)
	{
		for(int i=1;i<=m;i++)
		{
			cin>>x>>y;
			int posA=0,len=y-x+1;
			if(mini[x][lg[len]]<=mini[y-(1<<lg[len])+1][lg[len]])posA=pos[x][lg[len]];
			else posA=pos[y-(1<<lg[len])+1][lg[len]];
			tmp=sum[posA]*(posA-x+1)*(y-posA+1);
			tmp+=sum2[x]-sum2[posA]-dp2[posA]*(posA-x);
			tmp+=sum1[y]-sum1[posA]-dp1[posA]*(y-posA);
			ans^=tmp;
		}
	}
	if(type==1)
	{
		cin>>gen::s>>gen::a>>gen::b>>gen::c;
		for(int i=1;i<=m;i++)
		{
			x=gen::rand()%n+1;y=gen::rand()%n+1;
			if(x>y)swap(x,y);
			//cout<<x<<" "<<y<<" "<<gen::s<<" "<<gen::a<<" "<<gen::b<<" "<<gen::c<<" "<<gen::lastans<<" "<<ans<<"\n";
			int posA=0,len=y-x+1;
			if(mini[x][lg[len]]<=mini[y-(1<<lg[len])+1][lg[len]])posA=pos[x][lg[len]];
			else posA=pos[y-(1<<lg[len])+1][lg[len]];
			tmp=sum[posA]*(posA-x+1)*(y-posA+1);
			tmp+=sum2[x]-sum2[posA]-dp2[posA]*(posA-x);
			tmp+=sum1[y]-sum1[posA]-dp1[posA]*(y-posA);
			ans^=tmp;gen::lastans=tmp;
		}
	}
	cout<<ans;
	return 0;
}
2023/8/24 15:11
加载中...