求调
  • 板块题目总版
  • 楼主Young_17
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/11/23 23:34
  • 上次更新2024/11/24 10:38:49
查看原帖
求调
925186
Young_17楼主2024/11/23 23:34

可持久化线段树求调

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int a[N],w[N<<5],lch[N<<5],rch[N<<5],lzy[N<<5],gen[N],preNode,Nodeid;
struct Node
{
	int t,x,k;
}b[N+5];
int WYXGJD(int &p)
{
	if(p>preNode)
	{
		return p;
	}
	else
	{
		w[++Nodeid]=w[p];
		lch[Nodeid]=lch[p];
		rch[Nodeid]=rch[p];
		p=Nodeid;
		return p;
	}
}
void pushup(int u)
{
	if(u==0)return ;
	w[u]=max(w[lch[u]],w[rch[u]]);
	return ;
}
int build(int l,int r)
{
	int u=++Nodeid;
	//cout<<u<<" "<<l<<" "<<r<<endl;
	if(l==r)
	{
		w[u]=a[l];
		return u;
	}
	int mid=(l+r)/2;
	lch[u]=build(l,mid);
	rch[u]=build(mid+1,r);
	pushup(u);
	return u;
}
void updata(int &u,int l,int r,int ql,int qr,int x)
{
	//cout<<ql<<" "<<qr<<endl;
	if(ql<=l&&r<=qr)
	{
		WYXGJD(u);
		w[u]=x;
		//lzy[u]+=x;
		return ;
	}
	int mid=(l+r)/2;
	if(r<ql||qr<l)return ;
	WYXGJD(u);
	if(l<=mid)
	{
		updata(lch[u],l,mid,ql,qr,x);
	}
	if(r>=mid+1)
	{
		updata(rch[u],mid+1,r,ql,qr,x);
	}
	pushup(u);
}
int Q(int u,int l,int r,int ql,int qr)
{
	//cout<<u<<" "<<l<<" "<<r<<endl;
	if(ql<=l&&r<=qr)
	{
		//cout<<u<<"*"<<w[u]<<endl;
		return w[u];
	}
	int mid=(l+r)/2;
	int maxx=0;
	if(r<ql||qr<l)return 0;
	if(l<=mid)
	{
		maxx=Q(lch[u],l,mid,ql,qr);
	}
	if(r>=mid+1)
	{
		maxx=max(maxx,Q(rch[u],mid+1,r,ql,qr));
	}
	return maxx+lzy[u];
}
bool cmp(Node x,Node y)
{
	return x.t<y.t;
}
bool cmpp(Node x,int y)
{
	return x.t<=y;
}
int main()
{
	int n,m,T;
	cin>>n>>m>>T;
	for(int i=1;i<=n;i++)cin>>a[i];
	build(1,n);
	for(int i=1;i<=m;i++)
	{
		cin>>b[i].t>>b[i].x>>b[i].k;
	}
	sort(b+1,b+m+1,cmp);
	
	gen[0]=1;
	for(int i=1;i<=m;i++)
	{
		if(b[i].t!=b[i-1].t)preNode=Nodeid,gen[b[i].t]=gen[b[i-1].t];
		updata(gen[b[i].t],1,n,b[i].x,b[i].x,b[i].k);
		
	}
	/*
	for(int i=1;i<=n;i++)
	{
		cout<<gen[i]<<" ";
	}
	*/
	//cout<<endl;
	int las=0;
	for(int i=1;i<=m;i++)
	{
		int l,r,bb,c;
		cin>>l>>r>>bb>>c;
		int t=(bb*las+c)%T;
		if(t<0)t=0; 
		if(gen[t]==0)gen[t]=gen[b[lower_bound(b+1,b+m+1,t,cmpp)-b].t];

		las=Q(gen[t],1,n,l,r);
		//cout<<t<<endl;
		//dfs(gen[t],1,n);
		//cout<<endl;
		cout<<las<<endl;
	}
	return 0;
}
```cpp
2024/11/23 23:34
加载中...