社区讨论

70pts,求条

P14152千手百眼,天下人间参与者 2已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@mhj33gry
此快照首次捕获于
2025/11/03 19:56
4 个月前
此快照最后确认于
2025/11/03 19:56
4 个月前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=5e5+10;
const int INF=1e18;
struct E{
	int op,id,t,l,r,k;
};
int n,m;
int a[N];
E e[N];
int ans[N],cnt;
int f[N],fa[N];
bool v[N];
struct T{
	int v,lz;
}tr[N*4];
void bd(int x,int l,int r){
	tr[x].lz=0;
	if(l==r){
		tr[x].v=a[l];
		return;
	}
	int m=(l+r)/2;
	bd(x*2,l,m);
	bd(x*2+1,m+1,r);
	tr[x].v=max(tr[x*2].v,tr[x*2+1].v);
}
void pd(int x){
	if(tr[x].lz){
		tr[x*2].v+=tr[x].lz;
		tr[x*2].lz+=tr[x].lz;
		tr[x*2+1].v+=tr[x].lz;
		tr[x*2+1].lz+=tr[x].lz;
		tr[x].lz=0;
	}
}
void up(int x,int l,int r,int ql,int qr,int k){
	if(ql<=l&&r<=qr){
		tr[x].v+=k;
		tr[x].lz+=k;
		return;
	}
	pd(x);
	int m=(l+r)/2;
	if(ql<=m) up(x*2,l,m,ql,qr,k);
	if(qr>m) up(x*2+1,m+1,r,ql,qr,k);
	tr[x].v=max(tr[x*2].v,tr[x*2+1].v);
}
int qy(int x,int l,int r,int ql,int qr){
	if(ql<=l&&r<=qr) return tr[x].v;
	pd(x);
	int m=(l+r)/2,res=-INF;
	if(ql<=m) res=max(res,qy(x*2,l,m,ql,qr));
	if(qr>m) res=max(res,qy(x*2+1,m+1,r,ql,qr));
	return res;
}
int fd(int x){
	return fa[x]==x?x:fa[x]=fd(fa[x]);
}
vector<int> ts;
int get(int t){
	return lower_bound(ts.begin(),ts.end(),t)-ts.begin();
}
signed main(){
	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0);
	
	cin>>n>>m;
	for(int i=1;i<=n;i++) cin>>a[i];
	
	for(int i=0;i<m;i++){
		cin>>e[i].op;
		if(e[i].op==1){
			cin>>e[i].t>>e[i].l>>e[i].r>>e[i].k;
		}else{
			cin>>e[i].t>>e[i].l>>e[i].r;
			e[i].k=0;
		}
		e[i].id=i;
		v[i]=1;
		ts.push_back(e[i].t);
	}
	sort(ts.begin(),ts.end());
	ts.erase(unique(ts.begin(),ts.end()),ts.end());
	int sz=ts.size();
	for(int i=0;i<=sz;i++) fa[i]=i;
	vector<int> d(sz+2,0);
	for(int i=m-1;i>=0;i--){
		if(e[i].op==3){
			int L=e[i].l,R=e[i].r;
			int l=get(L),r=upper_bound(ts.begin(),ts.end(),R)-ts.begin()-1;
			if(l<=r){
				d[l]++;
				d[r+1]--;
			}
		}
	}
	vector<bool> flag(sz,true);
	int sum=0;
	for(int i=0;i<sz;i++){
		sum+=d[i];
		if(sum>0) flag[i]=false;
	}
	bd(1,1,n);
	vector<pair<int,int> > a2;
	for(int i=0;i<m;i++){
		int tid=get(e[i].t);
		if(flag[tid]&&e[i].op!=3){
			a2.push_back({e[i].t,e[i].id});
		}
	}
	sort(a2.begin(),a2.end(),[&](pair<int,int> a,pair<int,int> b){
		if(a.first!=b.first) return a.first<b.first;
		return a.second<b.second;
	});
	for(auto p:a2){
		int i=p.second;
		if(e[i].op==1){
			up(1,1,n,e[i].l,e[i].r,e[i].k);
		}else if(e[i].op==2){
			ans[cnt++]=qy(1,1,n,e[i].l,e[i].r);
		}
	}
	cout<<cnt<<"\n";
	for(int i=0;i<cnt;i++) cout<<ans[i]<<"\n";
	return 0;
}

回复

1 条回复,欢迎继续交流。

正在加载回复...