社区讨论

WA--->AC?

AT_dp_wIntervals参与者 8已保存回复 22

讨论操作

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

当前回复
22 条
当前快照
1 份
快照标识符
@mhjd7fii
此快照首次捕获于
2025/11/04 00:39
4 个月前
此快照最后确认于
2025/11/04 06:12
4 个月前
查看原帖
这是AC的代码:
CPP
#include<bits/stdc++.h>
#define int long long
#define N 4000005
using namespace std;
int tree[N<<2];
int mx[N<<2];
int tag[N<<2];
int ls(int p){
	return p<<1;
}
int rs(int p){
	return p<<1|1;
}
void push_up(int p){
	tree[p]=tree[ls(p)]+tree[rs(p)];
	mx[p]=max(mx[ls(p)],mx[rs(p)]);
	return;
}
void addtag(int p,int pl,int pr,int d){
	tree[p]+=(pr-pl+1)*d;
	tag[p]+=d;
	mx[p]+=d;
	return;
}
void push_down(int p,int pl,int pr){
	if(tag[p]){
		int mid=(pl+pr)>>1;
		addtag(ls(p),pl,mid,tag[p]);
		addtag(rs(p),mid+1,pr,tag[p]);
		tag[p]=0;
		return;
	}
}
void update(int p,int L,int R,int pl,int pr,int d){
	if(L<=pl&&pr<=R){
		addtag(p,pl,pr,d);
		return;
	}
	int mid=(pl+pr)>>1;
	push_down(p,pl,pr);
	if(L<=mid){
		update(ls(p),L,R,pl,mid,d);
	}
	if(R>mid){
		update(rs(p),L,R,mid+1,pr,d);
	}
	push_up(p);
}
int query(int p,int L,int R,int pl,int pr){
	if(L<=pl&&pr<=R){
		return mx[p];
	}
	int mid=(pl+pr)>>1,res=-1e14;
	push_down(p,pl,pr);
	if(L<=mid){
		res=max(res,query(ls(p),L,R,pl,mid));
	}
	if(R>mid){
		res=max(res,query(rs(p),L,R,mid+1,pr));
	}
	return res;
}
struct node{
	int k,w;
};
int dp[N];
vector<node> vecl[N];
vector<node> vecr[N];
int l[N],r[N],a[N];
void build(int p,int pl,int pr){
	if(pl==pr){
		mx[p]=-1e14;
		return;
	}
	int mid=(pl+pr)>>1;
	build(ls(p),pl,mid);
	build(rs(p),mid+1,pr);
	push_up(p);
}
signed main(){
	int n,m;
	cin>>n>>m;
	build(1,0,n);
	for(int i=1;i<=m;i++){
		cin>>l[i]>>r[i]>>a[i];
		vecl[l[i]].push_back(node{r[i],a[i]});
		vecr[r[i]].push_back(node{l[i],a[i]});
	}
	int mmax=0;
	for(int i=1;i<=n;i++){
//		cout<<"i:"<<i<<endl;
//		for(int j=0;j<=10;j++){
//			cout<<query(1,j,j,0,N)<<" ";
//		}
//		cout<<endl;
		for(int j=0;j<vecr[i-1].size();j++){
			node p=vecr[i-1][j];
			update(1,0,p.k-1,0,N,-p.w);
			//cout<<0<<" "<<p.k-1<<" "<<-p.w<<endl;
		}
		for(int j=0;j<vecl[i].size();j++){
			node p=vecl[i][j];
			update(1,0,i-1,0,N,p.w);
			//cout<<0<<" "<<i-1<<" "<<p.w<<endl;
		}
//		for(int j=0;j<=10;j++){
//			cout<<query(1,j,j,0,N)<<" ";
//		}
//		cout<<endl;
		//cout<<"query:"<<0<<"---"<<i-1<<" "<<query(1,0,i-1,0,N)<<endl;
		dp[i]=query(1,0,i-1,0,N);
		//cout<<"dp i:"<<dp[i]<<endl;
		mmax=max(mmax,dp[i]);
		update(1,i,i,0,N,dp[i]);
	}
	cout<<mmax<<endl;
	return 0;
}

如果把N改成400000,就过不了了 求调,悬一关

回复

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

正在加载回复...