Snowy Smile hdu 6638 线段树
题意:在二维平面上有一些点 每个点有权值 问怎样选定一个矩形 取这个矩形内部的所有权值 使得权值和最大
比赛的时候没想出来可惜了
一直在想枚举上下边界 但枚举上下边界已经用了n2了 剩下一个log肯定不够
可以只枚举上边界 然后动态枚举下边界
注意更新的时候一定要等到 a[j].x!=a[j-1].x
#include<bits/stdc++.h> using namespace std; //input by bxd #define rep(i,a,b) for(int i=(a);i<=(b);i++) #define repp(i,a,b) for(int i=(a);i>=(b);--i) #define ll long long #define see(x) (cerr<<(#x)<<'='<<(x)<<endl) #define pb push_back #define inf 0x3f3f3f3f #define CLR(A,v) memset(A,v,sizeof A) typedef pair<int,int>pii; // const int N=2e6+10;#define lson l,m,pos<<1 #define rson m+1,r,pos<<1|1ll lmax[N<<2],rmax[N<<2],t[N<<2],maxans[N<<2];void up(int pos) {t[pos]=t[pos<<1]+t[pos<<1|1];maxans[pos]=max( max(maxans[pos<<1],maxans[pos<<1|1]),rmax[pos<<1]+lmax[pos<<1|1] );lmax[pos]=max(lmax[pos<<1],t[pos<<1]+lmax[pos<<1|1]);rmax[pos]=max(rmax[pos<<1|1],t[pos<<1|1]+rmax[pos<<1]); } void build(int l,int r,int pos) {if(l==r){lmax[pos]=rmax[pos]=t[pos]=maxans[pos]=0;return ; }int m=(l+r)>>1;build(lson);build(rson);up(pos); } void upnode(int x,ll v,int l,int r,int pos) {if(l==r){t[pos]+=v; lmax[pos]=rmax[pos]=maxans[pos]=max(1ll*0,t[pos]);return ;}int m=(l+r)>>1;if(x<=m)upnode(x,v,lson);else upnode(x,v,rson);up(pos); } int n,k,b[N],nn;struct node {int x,y,w; }a[N]; int main() {int cas;cin>>cas;while(cas--){scanf("%d",&n);rep(i,1,n){scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].w);b[++nn]=a[i].y;}sort(b+1,b+1+nn);nn=unique(b+1,b+1+nn)-b-1;rep(i,1,n)a[i].y=lower_bound(b+1,b+1+nn,a[i].y)-b;sort(a+1,a+1+n,[](node a,node b){return a.x<b.x||a.x==b.x&&a.y<b.y;});ll ans=0;rep(i,1,n){if(i!=1&&a[i].x==a[i-1].x)continue;build(1,nn,1);rep(j,i,n){if(j!=i&&a[j].x!=a[j-1].x)ans=max(ans,maxans[1]);upnode(a[j].y,1ll*a[j].w,1,nn,1);}ans=max(ans,maxans[1]);}cout<<ans<<endl;}return 0; }
View Code
转载于:https://www.cnblogs.com/bxd123/p/11334187.html
Snowy Smile hdu 6638 线段树相关推荐
- 2019杭电暑假多校训练 第六场 Snowy Smile HDU - 6638
很多题解都是简单带过,所以打算自己写一篇,顺便也加深自己理解 前置知识:线段树.线段树维护最大字段和.二维坐标离散化 题解: 1.很容易想到我们需要枚举所有子矩阵来得到一个最大子矩阵,所以我们的任务是 ...
- POJ 2777 ZOJ 1610 HDU 1698 --线段树--区间更新
直接将这3题 放一起了 今天在做线段树的东西 这3个都是区间更新的 查询方式互相不同 反正都可以放到一起吧 直接先上链接了 touch me touch me touch me 关于涉及到区间的修改 ...
- hdu 5367(线段树+区间合并)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5367 官方题解: 对于求"高山脉"长度,可以利用线段树.树节点中保存左高度连续长度 ...
- hdu 5266(线段树+LCA)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5266 解题思路: 考虑dfs序,通过在简单的证明可知L~R的LCA为L ~R 中dfs序较小的那个位置 ...
- hdu 5124(线段树区间更新+lazy思想)
http://acm.hdu.edu.cn/showproblem.php?pid=5124 题意:区间覆盖次数问题. 解题思路:线段树水之. #include<iostream> #in ...
- HDU - 4578Transformation——线段树+区间加法修改+区间乘法修改+区间置数+区间和查询+区间平方和查询+区间立方和查询
[题目描述] HDU - 4578Transformation Problem Description Yuanfang is puzzled with the question below: The ...
- poj 2777 AND hdu 5316 线段树
区间染色问题,用线段树可以解决.颜色总类不多,故考虑用二进制数的每一位表示一种颜色,然后父节点的颜色就是孩子节点颜色"或"起来,加上lazy标记,轻松AC. poj 2777: 1 ...
- HDU 5238 线段树+数论
原题:http://acm.hdu.edu.cn/showproblem.php?pid=5238. 题解:给你长度为n的操作序列,和m组操作求每组操作的模29393的值.这道题直接显然是没有前途的, ...
- poj 2528 离散化+线段树 hdu 1698 线段树 线段树题目类型一:染色计数 外加离散化
第一次听到离散化是今年省赛的时候,一道矩形并的题,很水,就两个矩形... 今天再去做线段树已经发现离散化忘得差不多了...水逼的悲哀啊... 先看简单点的hdu 1698 http://acm.hdu ...
- HDU 1166(线段树)
线段树 1 #include <cstdio> 2 #include <iostream> 3 using namespace std; 4 #define N 200010 ...
最新文章
- 万字长文让你看够幂级数
- 可变悬挂与空气悬挂的区别_可变悬架和空气悬架的的区别是什么
- 生活感悟 2018-06-13
- 【蓝桥杯Java_C组·从零开始卷】第四节、一维数组与二维数组
- 基于VC的OPC客户端软件研究与实现
- linux help命令编写,Linux shell命令帮助格式详解
- 广度优先搜索(BFS)——抓住那头牛(POJ 4001)
- 在winform中,禁止combobox随着鼠标一起滑动!
- 循环链表(约瑟夫环问题)
- 用DataFormatString格式化GridView 【转】
- FindFirstFile和FindNextFile
- Dagger2 知识梳理(3) 使用 dependencies 和 @SubComponent 完成依赖注入
- 转自weiphone]在美做开发多年,写给国内apple开发新手的一些心得,无教程
- abaqus6.14安装教程 如何设置中文
- Pycharm生成决策树
- 什么IT项目可以兼职在学校做
- 【2019.11.27】EM算法详细推导
- 新型前端学习成长计划路线规划
- C语言程序设计教程习题和答案-C语言期末复习必看资料
- 常用页面代码html