前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >hdu6638 Snowy Smile (最大权值和矩阵、线段树维护最大子段和)

hdu6638 Snowy Smile (最大权值和矩阵、线段树维护最大子段和)

作者头像
用户2965768
发布2019-08-14 14:18:37
4890
发布2019-08-14 14:18:37
举报
文章被收录于专栏:wymwym
代码语言:javascript
复制
#include <bits/stdc++.h>
#define ll long long
#define ls rt<<1
#define rs rt<<1|1
using namespace std;
const int maxn = 1e5;
struct N{
	ll lm,rm,mm,sum;
}t[maxn<<2];
void push(int rt){
	t[rt].sum = t[ls].sum + t[rs].sum;
	t[rt].lm = max(t[ls].lm,t[ls].sum+t[rs].lm);
	t[rt].rm = max(t[rs].rm,t[rs].sum+t[ls].rm);
	t[rt].mm = max(max(t[ls].mm,t[rs].mm),t[ls].rm+t[rs].lm);
}
void build(int rt,int l,int r){
	t[rt].lm = t[rt].rm = t[rt].mm = t[rt].sum = 0;
	if(l==r)return ;
	int mid = l+r>>1;
	build(ls,l,mid);
	build(rs,mid+1,r);
	push(rt);	
}
void update(int rt,int l,int r,int pos,ll val){
	if(l==r){
		t[rt].sum+=val;
		t[rt].lm = t[rt].rm = t[rt].mm = t[rt].sum;
		return;
	}
	int mid = l+r>>1;
	if(pos<=mid) update(ls,l,mid,pos,val);
	else update(rs,mid+1,r,pos,val);
	push(rt);
}
//以上求最大子段和
struct P{
	int x,y;
	ll val;
}p[maxn]; 
bool cmp(P a,P b){
	return a.y == b.y?a.x<b.x:a.y>b.y;
}
vector<int> vx,vy;
int getidx(int x){
	return lower_bound(vx.begin(),vx.end(),x) - vx.begin()+1;
}
int getidy(int y){
	return lower_bound(vy.begin(),vy.end(),y) - vy.begin()+1;
}
 
int main()
{
	int _,n,len;
	for(scanf("%d",&_);_;_--){
		vx.clear();	vy.clear();
		scanf("%d",&n);
		for(int i=1;i<=n;i++){
			scanf("%d %d %lld",&p[i].x,&p[i].y,&p[i].val);	
			vx.push_back(p[i].x);
			vy.push_back(p[i].y); 
		}
		sort(vx.begin(),vx.end());	vx.erase(unique(vx.begin(),vx.end()),vx.end());	len = vx.size();
		sort(vy.begin(),vy.end());	vy.erase(unique(vy.begin(),vy.end()),vy.end());
		for(int i=1;i<=n;i++){
			p[i].x = getidx(p[i].x);
			p[i].y = getidy(p[i].y); 
		}
		sort(p+1,p+n+1,cmp);
		ll ans = -1e18,last = -1;
		for(int i=1;i<=n;i++){//上边界 
			if(p[i].y == last)continue;
			build(1,1,len);
			int k;
			for(int j=i;j<=n;j=k){
				for(k=j;k<=n&&p[k].y==p[j].y;k++){
					update(1,1,len,p[k].x,p[k].val);
				}
				ans = max(ans,t[1].mm);
			}
			last = p[i].y;
		}
		printf("%lld\n",ans);
	}
	return 0;
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019年08月10日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档