20pts求调
查看原帖
20pts求调
348842
little_warp楼主2023/10/1 11:49

rt,不知为什么只A了Sub3

#include<iostream>
#include<cstring>
#include<cstdio>
#include<vector>
#include<algorithm>
#define lc tr[i].ch[0]
#define rc tr[i].ch[1]
#define mid (l+r)/2
using namespace std;
const int M=1e5;
const int N=2e5;
int f[N+5],bPos[N+5],bC[M+5],n,m,color;
vector<int>to[N+5];
struct Edge{
	int l,r,c,w;
	friend bool operator<(Edge A,Edge B){
		return A.r<B.r;
	}
}E[M+5];
struct segNode{
	int ch[2];
	int maxn,lz;
};
int rt[M+5],cnt;
struct segTree{
	segNode tr[10*N+5];
	void lazy(int i,int val){
		tr[i].lz+=val;
		tr[i].maxn+=val;
	}
	void pushdown(int i){
		lazy(lc,tr[i].lz);
		lazy(rc,tr[i].lz);
		tr[i].lz=0;
	}
	void pushup(int i){
		tr[i].maxn=max(tr[lc].maxn,tr[rc].maxn);
	}
	void build(int &i,int l,int r,int x,int val){
		if(!i){
			i=++cnt;
		}
		if(l==r){
			tr[i].maxn=val;
			return;
		}
		pushdown(i);
		if(x<=mid){
			build(lc,l,mid,x,val);
		}else{
			build(rc,mid+1,r,x,val);
		}
		pushup(i);
	}
	void update(int i,int l,int r,int L,int R,int val){
		if(!i){
			return;
		}
		if(L<=l&&R>=r){
			return lazy(i,val);
		}
		pushdown(i);
		if(L<=mid){
			update(lc,l,mid,L,R,val);
		}
		if(R>mid){
			update(rc,mid+1,r,L,R,val);
		}
		pushup(i);
	}
	int query(int i){
		return tr[i].maxn;
	}
}seg;
int main(){
	scanf("%d",&m);
	for(int i=1;i<=m;i++){
		scanf("%d%d%d%d",&E[i].l,&E[i].r,&E[i].c,&E[i].w);
		bPos[++n]=E[i].l;
		bPos[++n]=E[i].r+1;
		bC[++color]=E[i].c;
	}
	n++;
	sort(bPos+1,bPos+n+1);
	n=unique(bPos+1,bPos+n+1)-bPos-1;
	sort(bC+1,bC+color+1);
	color=unique(bC+1,bC+color+1)-bC-1;
	for(int i=1;i<=m;i++){
		E[i].l=lower_bound(bPos+1,bPos+n+1,E[i].l)-bPos;
		E[i].r=lower_bound(bPos+1,bPos+n+1,E[i].r+1)-bPos-1;
		E[i].c=lower_bound(bC+1,bC+color+1,E[i].c)-bC;
		to[E[i].l-1].push_back(E[i].c);
	}
	sort(E+1,E+m+1);
	int p=0;
	for(int i=1;i<n;i++){
		while(p<m&&E[p+1].r==i){
			++p;
			int l=E[p].l,r=E[p].r,c=E[p].c,w=E[p].w;
			seg.update(rt[c],1,n,1,l-1,w);
			f[i]=max(f[i],seg.query(rt[c]));
		}
		f[i]=max(f[i],f[i-1]);
		for(int j=0;j<to[i].size();j++){
			int x=to[i][j];
			seg.build(rt[x],1,n,i,f[i]);
		}
	}
	printf("%d\n",f[n-1]);
	return 0;
}
2023/10/1 11:49
加载中...