一个平面上有 n 个点,每个点有一个对应的权值,其他点的权值都是0,让你选一个矩形,要求矩形内所有点的权值最大。

枚举上边界,对于每一行的点,将他依此加入到线段树中,同时更新最大值。时间复杂度 

大力区间和并,查询的时候还要同时查一下跨左右区间的最大值。

#include <bits/stdc++.h>
#define lson left,mid,k<<1
#define rson mid+1,right,k<<1|1
#define imid int mid=(que[k].l+que[k].r)/2;
#define ll long long
#define sc scanf
#define pr printf
using namespace std;
const int MAXN = 2005;
struct note
{int x;int y;ll val;
}in[MAXN];
int t1[MAXN], t2[MAXN];
struct node
{int l;int r;ll lmaxn;ll rmaxn;ll maxn;ll sum;
}que[MAXN * 4];
int n, qq1, qq2;
void up(int k)
{que[k].sum = que[k << 1].sum + que[k << 1 | 1].sum;que[k].maxn = max({ que[k << 1].maxn,que[k << 1 | 1].maxn,que[k << 1].rmaxn + que[k << 1 | 1].lmaxn });que[k].lmaxn = max(que[k << 1].lmaxn, que[k << 1].sum + que[k << 1 | 1].lmaxn);que[k].rmaxn = max(que[k << 1 | 1].rmaxn, que[k << 1 | 1].sum + que[k << 1].rmaxn);
}
void build(int left = 1, int right = n, int k = 1)
{que[k].l = left;que[k].r = right;if (left == right){que[k].sum = 0;que[k].maxn = 0;que[k].lmaxn = 0;que[k].rmaxn = 0;return;}imid;build(lson);build(rson);up(k);
}
void update(int pos, ll val, int k)
{if (que[k].l == que[k].r){que[k].sum += val;que[k].maxn += val;que[k].lmaxn += val;que[k].rmaxn += val;return;}imid;if (pos <= mid)update(pos, val, k << 1);if (pos > mid)update(pos, val, k << 1 | 1);up(k);
}
ll queryl(int left, int right, int k)
{if (left == que[k].l && que[k].r == right)return que[k].lmaxn;imid;if (right <= mid)return queryl(left, right, k << 1);else if (left > mid)return queryl(left, right, k << 1 | 1);elsereturn max({ queryl(lson), que[k << 1].maxn + queryl(rson) });
}
ll queryr(int left, int right, int k)
{if (left == que[k].l && que[k].r == right)return que[k].rmaxn;imid;if (right <= mid)return queryr(left, right, k << 1);else if (left > mid)return queryr(left, right, k << 1 | 1);elsereturn max({ queryr(rson), queryr(lson) + que[k << 1 | 1].maxn });
}
ll query(int left, int right, int k)
{if (left == que[k].l && que[k].r == right)return que[k].maxn;imid;if (right <= mid)return query(left, right, k << 1);else if (left > mid)return query(left, right, k << 1 | 1);elsereturn max({ query(lson),query(rson),queryr(lson) + queryl(rson) });
}
int main()
{int T;sc("%d", &T);while (T--){scanf("%d", &n);for (int i = 1; i <= n; i++){scanf("%d%d%lld", &in[i].x, &in[i].y, &in[i].val);t1[i] = in[i].x;t2[i] = in[i].y;}sort(t1 + 1, t1 + 1 + n);qq1 = unique(t1 + 1, t1 + 1 + n) - t1 - 1;for (int i = 1; i <= n; i++)in[i].x = lower_bound(t1 + 1, t1 + 1 + qq1, in[i].x) - t1;sort(t2 + 1, t2 + 1 + n);qq2 = unique(t2 + 1, t2 + 1 + n) - t2 - 1;for (int i = 1; i <= n; i++)in[i].y = lower_bound(t2 + 1, t2 + 1 + qq2, in[i].y) - t2;sort(in + 1, in + 1 + n, [](note q, note w) {if (q.y == w.y)return q.x < w.x;return q.y < w.y;});ll ans = 0;for (int i = 1; i <= qq2; i++){build(1, qq1, 1);for (int j = 1; j <= n; j++){if (in[j].y < i)continue;if (in[j].y != in[j - 1].y){ll res = query(1, qq1, 1);ans = max(res, ans);}update(in[j].x, in[j].val, 1);}ll res = query(1, qq1, 1);ans = max(res, ans);}pr("%lld\n", ans);}
}
/*
1
9
1 1 1
1 2 1
1 3 1
2 1 1
2 2 -9
2 3 1
3 1 1
3 2 1
3 3 1
*/

hdu 6638 Snowy Smile 线段树维护最大子段和相关推荐

  1. Can you answer these queries III (线段树维护最大子段和)

    题意: 求一个区间的最大连续和. 0:表示把A[x]改成y 1:表示求[x,y]这个区间的最大连续和. 题解: 线段树维护四个变量. 倒着讲,先来看如何维护这四个变量. summax代表这个区间连续最 ...

  2. [SDOI2011]染色 (线段树维护子段问题+树剖)

    题意: 给定一棵 n 个节点的无根树,共有 m 个操作,操作分为两种: 1.将节点 a 到节点 b 的路径上的所有点(包括 a 和 b)都染成颜色 c. 2.询问节点 a 到节点 b 的路径上的颜色段 ...

  3. HDU 2681 MM Programming Club(miaos的线段树维护+ycy的暴力贪心)

    Description ACM is popular in HDU. Many girls want to learn more about programming skills in ACM. As ...

  4. hdu 2871 Memory Control(线段树)

    题目链接:hdu 2871 Memory Control 题目大意:模拟一个内存分配机制. Reset:重置,释放全部空间 New x:申请内存为x的空间,输出左地址 Free x:释放地址x所在的内 ...

  5. 线段树维护(最大区间和,最大子段和,最长连续上升子序列)

    本文主要介绍用线段树来维护(最大区间和,最大子段和,最长连续上升子序列)的问题. HDU 1540 Tunnel Warfare(最长连续区间+单点修改) 洛谷 P2894 [USACO08FEB]酒 ...

  6. [动态dp]线段树维护转移矩阵

    背景:czy上课讲了新知识,从未见到过,总结一下. 所谓动态dp,是在动态规划的基础上,需要维护一些修改操作的算法. 这类题目分为如下三个步骤:(都是对于常系数齐次递推问题) 1先不考虑修改,不考虑区 ...

  7. Codeforces Round #742 (Div. 2) E. Non-Decreasing Dilemma (线段树维护区间连续问题)

    题意: 操作1:把x位置的数字修改成y. 操作2:查询[l,r]之间不下降序列的个数. 题解: 线段树维护区间和问题 (这是套路,想不到只能说做题少别打我) . 用五个变量进行维护. sum区间总个数 ...

  8. 线段树 ---- D. Power Tree(离线dfs序+线段树维护树上多条路径和的技巧)

    题目链接 题目大意: 一开始给你只有一个点111的树,有qqq次询问.每次询问有两种操作 1pv1\;p\;v1pv 就是把最小的没加入的点,加入这个树,它的父亲是ppp,权值是vvv 2u2\;u2 ...

  9. 【uoj#164】[清华集训2015]V 线段树维护历史最值

    题目描述 给你一个长度为 $n$ 的序列,支持五种操作: $1\ l\ r\ x$ :将 $[l,r]$ 内的数加上 $x$ : $2\ l\ r\ x$ :将 $[l,r]$ 内的数减去 $x$ , ...

  10. Codeforces Round #343 (Div. 2) D. Babaei and Birthday Cake 线段树维护dp

    D. Babaei and Birthday Cake 题目连接: http://www.codeforces.com/contest/629/problem/D Description As you ...

最新文章

  1. python01-变量,运算符与数据类型+位运算
  2. 080_html5 Canvas和SVG
  3. 剑指offer面试题27:二叉搜索树与双向链表
  4. 这谁写的技术文档?我想锤死他...
  5. 在SAP HANA Express Edition里进行文本分析
  6. android system.img编译,快速编译system.img和boot.img的方法
  7. 人民邮电报:区块链和工业互联网的融合 将产生叠加倍增效应
  8. Posterino常见问题:为什么渲染的文档在打印时看起来模糊?
  9. 迷宫问题的通用解法C语言数据结构实现
  10. __index元方法
  11. 关于三星研究院adv机试(开发人员入职机试)
  12. 在ODBC 中 应 用DDX 和RFX (转)
  13. 基于OpenCASCADE自制三维建模软件(三)搭建开发环境
  14. 使用VM安装Centos7虚拟机
  15. 6s信号时有有时无服务器,苹果iPhone6s信号弱或无服务解决方法
  16. 基于keil5 的stm32F103C8T6的ST-LINK V2的仿真器使用
  17. 破解版的cornerstore(mac版)
  18. 人工智能AI课 推荐算法详解和实现
  19. STM32 IAP升级(bootLoader)
  20. 《无线与移动网技术》笔记(二)无线网络物理层技术(非全)

热门文章

  1. PS快捷键大全,记住这些就够了!
  2. matlab scatter3点颜色,使用for循环MATLAB时,scatter3中的系列颜色与Legend不匹配
  3. NetLimiter 4.0.15.0 x64 破解新鲜出炉!
  4. python编写摇骰子游戏_python摇骰子猜大小的小游戏
  5. 干货分享!软考中高项案例分析10大管理领域理论背诵要点
  6. 【Spring】IoC,DI,两种代理方式,AOP定义和使用
  7. Linux:软硬链接
  8. 直接管理和维护计算机系统的程序称为,全国2008年04月自学考试计算机原理试题及答案.doc...
  9. Java的“跨平台”特性
  10. 海马玩模拟器离线安装包下载方法