题目链接、

题意:

给你n个点(小于等于2e3个),每个点有个价值val,有个x,y坐标(这三个值都是1e9的)

让你求一个最大的子矩阵和

T组(100)

题解:

线段树维护子段和

因为x,y,太大,所以要离散化,之后是一个n*n的矩阵,

这时,原本有一个算法,即,枚举一个上下界,然后一个的dp

当时我就这么写的,想了半天不造咋优化

后来才知道,线段树可以维护子段和

其实知道思想之后,很简单。。

线段树的精髓——区间合并,考虑怎么合并就行了:

1、合并的答案要么左区间的子段和,要么是右区间的子段和,要么是中间的一部分

2、考虑中间这部分怎么求,也就是说,其实求一个区间的最大,前后缀就行了,因为中间这部分就是

左区间的最大后缀+右区间的最大前缀

3、考虑怎么维护区间的前后缀、前缀的话,肯定是左区间前缀   和  左区间的区间和右区间的前缀  取一个最大值

后缀同理

注意到这里,只需要查询的是整个区间所有,连询问函数也不用写了,直接找根节点的值就行了

/*author:revolIA*/
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e4+7;
int T,n;
struct node{ll lsum,rsum,sum,Ans;void update(ll x){lsum += x;rsum += x;sum += x;Ans += x;}
}tree[maxn<<2];
void push_up(int x){tree[x].sum = tree[x<<1].sum+tree[x<<1|1].sum;tree[x].lsum = max(tree[x<<1].lsum,tree[x<<1].sum+tree[x<<1|1].lsum);tree[x].rsum = max(tree[x<<1|1].rsum,tree[x<<1|1].sum+tree[x<<1].rsum);tree[x].Ans = max(max(tree[x<<1].Ans,tree[x<<1|1].Ans),tree[x<<1].rsum+tree[x<<1|1].lsum);
}
void build(int L = 1,int R = n,int x = 1){tree[x].lsum = tree[x].rsum = 0;tree[x].sum = tree[x].Ans = 0;if(L == R)return;int mid = L+R>>1;build(L,mid,x<<1),build(mid+1,R,x<<1|1);//push_up(x);
}
void update(int k,ll val,int L=1,int R=n,int x = 1){if(L == R){tree[x].update(val);}else{int mid = L+R>>1;if(k<=mid)update(k,val,L,mid,x<<1);else update(k,val,mid+1,R,x<<1|1);push_up(x);}
}
vector<int> vecL,vecU;
vector<pair<int,ll> > vec[maxn];
ll x[maxn],y[maxn],val[maxn];
int main(){for(scanf("%d",&T);T--;){scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%lld%lld%lld",&x[i],&y[i],&val[i]);vecL.push_back(x[i]);vecU.push_back(y[i]);}sort(vecL.begin(),vecL.end());vecL.erase(unique(vecL.begin(),vecL.end()),vecL.end());sort(vecU.begin(),vecU.end());vecU.erase(unique(vecU.begin(),vecU.end()),vecU.end());for(int i=1;i<=n;i++){int x_ = lower_bound(vecL.begin(),vecL.end(),x[i])-vecL.begin()+1;int y_ = lower_bound(vecU.begin(),vecU.end(),y[i])-vecU.begin()+1;vec[x_].push_back(make_pair(y_,val[i]));}ll ans = 0;for(int i=1;i<=n;i++){build();for(int j=i;j<=n;j++){for(auto k:vec[j])update(k.first,k.second);ans = max(ans,tree[1].Ans);}}printf("%lld\n",ans);vecL.clear();vecU.clear();for(int i=1;i<=n;i++)vec[i].clear();}return 0;
}

2019杭电多校6,E.Snowy Smile(线段树维护子段和)相关推荐

  1. 2019 杭电多校 HDU - 6625 three arrays 字典树+贪心

    题目链接:https://cn.vjudge.net/problem/HDU-6625 题意:a和b两个数组n个数,数字任意组合异或,求得到c数组的字典序最小 题解:对于两个数组从高位到低位建立两个字 ...

  2. 2019杭电多校 第七场 Kejin Player 6656(求期望值)

    2019杭电多校 第七场 Kejin Player 6656(求期望值) 题目 http://acm.hdu.edu.cn/showproblem.php?pid=6656 题意 给你n,q.表示有n ...

  3. 【2019杭电多校训练赛】HDU6681 / 1002-Rikka with Cake 题解(扫描线)

    [2019杭电多校训练赛]HDU6681 / 1002-Rikka with Cake 题解 题意 思路 代码 题目来自于:HDU6681 Rikka with Cake 题意 题目的大意是给定你一个 ...

  4. 2019杭电多校第9场1002 Rikka with Cake HDU6681

    2019杭电多校第9场1002 Rikka with Cake HDU6681 题意:给你若干个点按上下左右切割平面,最后问平面内有几块被切割开来. 解法1:红黑树+思维+贪心 A:根据欧拉定理可以得 ...

  5. 2019 杭电多校第六场 题解

    比赛记录 注意随机数据 ,1-n排列这种,一般都有啥暴力重构之类的方法,期望重构次数很少之类的 1005也是这样,因为n^2但只有n个值有数,所以就可以n^2logn 题解 1001 Salty Fi ...

  6. 【2019.08.21】2019杭电多校第十场

    补题地址:http://acm.hdu.edu.cn/listproblem.php?vol=58 题号:6691-6701 1001: 1002: 1003:✅ 1004: 1005:✅ 1006: ...

  7. 2019杭电多校第一场 Operation HDU - 6579

    题意:给出一个序列,两种操作,求区间[l,r]的区间最大异或和,和在末尾添加一个数 思路:强制在线,保存每个线性基的数值,接下去直接去搜第r个线性基,但要保持时间比l要大,新增了一个pos数组代表一个 ...

  8. 2019杭电多校第九场 Rikka with Cake (hdu6681)

    题意:给出一个n * m的蛋糕,切 k 刀,每次从一个点(x,y)向 上下左右的一个方向切,问最后蛋糕被切成了几块 题解:显然,蛋糕的块数就是那么多线段的交点数 + 1.先离散,考虑向左切和向上切的, ...

  9. 2019杭电多校第三场 6608 Fansblog(威尔逊定理+miller_rabin素性测试)

    Problem Description 传送门 Farmer John keeps a website called 'FansBlog' .Everyday , there are many peo ...

  10. 2019 杭电 多校第3场 1006 Fansblog (HDU 6608)

    题目链接 题解: 用威尔逊定理变换,然后求逆元. 代码: #include <bits/stdc++.h> using namespace std; typedef long long l ...

最新文章

  1. python中pop函数_Python中的Pop函数
  2. 【面试】我是如何在面试别人Spring事务时“套路”对方的
  3. AR行业成本拆解解析
  4. Appcan关闭主窗口
  5. 暑假集训考试反思+其它乱写
  6. 手上红白点的中药药方
  7. android--超级手电筒的开发记录
  8. ces测试数据测试ces测试数据测试ces测试数据测试ces测试数据测试ces测试数据测试撒擦撒擦是
  9. Linux下find用法总结
  10. 【剑指offer】_06 变态跳台阶
  11. Web Map Gis 开发系列索引
  12. paraview如何查看速度三维坐标_AutoCAD三维建模与AutoLISP地形展点检查隧道工程开挖效果...
  13. Python 爬取 20 万条评论,告诉你周杰伦新歌为啥弄崩 QQ 音乐?
  14. paip.提升性能--- mysql 建立索引 删除索引 很慢的解决.
  15. 【端口扫描工具】nmap核心使用方法
  16. Tomcat之Directory Listing
  17. 解决鼠标滚动时页面上下跳动的问题
  18. python编写判断素数的函数并找出前五个摩尼森数_五十八、如何对一个数进行分解质因数...
  19. python for 无限循环
  20. Win10 升级后不能正常使用谷歌浏览器

热门文章

  1. 2021WSB-day2-4: Raffaele教授演示利用OpenCV和Python实现一个指纹识别系统 (含代码) part6
  2. Rapid Tampere加速联合产业创新
  3. Linux权限设置方法
  4. android吉他谱组件,Paranoid Android drum吉他谱
  5. 防止刷票的一些方法介绍
  6. 关于火狐浏览器访问淘宝网页时,点击店家旺旺无法弹出对话框的解决方案
  7. 数值分析课程主要学习内容总结
  8. PS与qq热键设置雷同
  9. delphi的时间Ttime,Tdatetime的信息
  10. VO、DTO、BO、DO、PO、POJO、Entity的概念、区别和应用