Snowy Smile HDU - 6638

题解看这位大佬,讲的很详细了。

传送门

反思:

  1. 本题做的时候,已经想到二维子段和了,但不知怎么维护。
  2. 看了题解,原来要用线段树,之后暴力算答案。
  3. 先只看纵坐标,即只看y时(即一条水平的扫描线时),那么先暴力枚举所有可能的矩形(这些矩形,只知道上下界,左右边界还是未知的
  4. 对于每一次枚举y上界时(即一条水平的扫描线时),可以看一下这条水平扫描线y上是否有点,有就加入到【1,cntx】的线段树里,根据x坐标,往区间里进行修改(由于数据坐标有1e9,所以要先离线做哦( ̄▽ ̄)")
    每次遇到 上界y 上的点都维护一下【1,cntx】。
  5. 上面讲到的线段树只维护【1,cntx】。每次y的下界确定时。枚举y上界。(由于每一次变动上界y,都是一个新矩形,所以更新下答案即可)
  6. 总复杂度 n 2 l o g n n^2logn n2logn

AC

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define mst(x,a) memset(x,a,sizeof(x))
#define lc u<<1
#define rc u<<1|1
using namespace std;
typedef long long ll;
const int maxn=2e3+10;
struct point {int x,y;ll val;bool operator<(const point&p)const{return y<p.y||(y==p.y&&x<p.x);}
}p[maxn];
struct node{ll sum,pre,mx,suf;//除了sum,其他都是max
}tree[maxn<<2];
void clean(int u, int l ,int r){tree[u].sum=tree[u].mx=tree[u].pre=tree[u].suf=0;if(l==r)return ;int mid=(l+r)>>1;clean(lc,l,mid);clean(rc,mid+1,r);///mid+1
}
void pushup(int u){tree[u].sum=tree[lc].sum+tree[rc].sum;tree[u].mx=max(max(tree[lc].mx,tree[rc].mx),tree[lc].suf+tree[rc].pre);tree[u].pre=max(tree[lc].pre,tree[lc].sum+tree[rc].pre);tree[u].suf=max(tree[rc].suf,tree[rc].sum+tree[lc].suf);
}
void modify(int u, int l, int r, int x, ll val){if(l==r){tree[u].mx=tree[u].pre=tree[u].suf=(tree[u].sum+=val);return ;}int mid=(l+r)>>1;if(x<=mid)modify(lc,l,mid,x,val);else modify(rc,mid+1,r,x,val);///mid+1pushup(u);
}
int n;
int lx[maxn],ly[maxn];
int cntx,cnty;
void init(){cntx=cnty=0;scanf("%d", &n);for(int i=1; i<=n; i++){scanf("%d%d%lld",&p[i].x,&p[i].y,&p[i].val);lx[++cntx]=p[i].x;ly[++cnty]=p[i].y;}sort(p+1,p+1+n);sort(lx+1,lx+1+cntx);sort(ly+1,ly+1+cnty);cntx=unique(lx+1,lx+1+cntx)-lx-1;cnty=unique(ly+1,ly+1+cnty)-ly-1;for(int i=1; i<=n; i++){p[i].x=lower_bound(lx+1,lx+1+cntx,p[i].x)-lx;p[i].y=lower_bound(ly+1,ly+1+cnty,p[i].y)-ly;}
}
int main()
{int t;scanf("%d", &t);while(t--){init();// cout<<"ok"<<endl;ll ans=0;int pos=1;for(int i=1; i<=cnty; i++){clean(1,1,cntx);for(int j=i,k=pos; j<=cnty; j++){while(k<=n&&j==p[k].y){modify(1,1,cntx,p[k].x,p[k].val);k++;}if(j==i)pos=k;ans=max(ans,tree[1].mx);}}printf("%lld\n",ans);}return 0;
}

HDU 6638二维扫描线+二维最大子段和+离线相关推荐

  1. 【C 语言】二级指针作为输入 ( 二维数组 | 二维数组遍历 | 二维数组排序 )

    文章目录 一.二维数组 1.二维数组声明及初始化 2.二维数组遍历 3.二维数组排序 二.完整代码示例 一.二维数组 前几篇博客中 , 介绍的是指针数组 ; 指针数组 的 结构特征 是 , 数组中的每 ...

  2. php 二位数组随机,PHP多维数组 php打乱数组二维数组多维数组的简单实例

    php中的shuffle函数只能打乱一维数组,有什么办法快速便捷的打乱多维数组?手册上提供了 上面这个是针对二维数组的! 下面针对多维数组的乱序方法?尽可能的方便快速: 以下函数也是出自php手册,可 ...

  3. Java数组(3)--二维(多维)数组

    二维数组相当于一维数组的元素是一维数组 一.二维数组声明赋值初始化 动态初始化① int[][] arr = new int[3][2]; 定义了名称为arr的二维数组 二维数组中有3个一维数组 每一 ...

  4. php 数组重新打乱_php打乱数组二维数组多维数组的简单实例

    php中的shuffle函数只能打乱一维数组,有什么办法快速便捷的打乱多维数组?手册上提供了 function shuffle_assoc($list) { if (!is_array($list)) ...

  5. MATLAB二维绘图(二)向图中添加标题,坐标轴,图标和文字信息

    MATLAB二维绘图(二)向图中添加标题,坐标轴,图标和文字信息 1.添加标题.图例.x轴信息和y轴信息,示例: %% 添加标题 clear; clc; close all; x = 0:0.1:2* ...

  6. python二维数组去重复_python 去除二维数组/二维列表中的重复行方法

    python 去除二维数组/二维列表中的重复行方法 之前提到去除一维数组中的重复元素用unique()函数,如果要去除二维数组中的重复行该怎么操作呢? import numpy as np arr = ...

  7. 二维码生成器二维码生成插件开发qrious源码

    初心-杨瑞超个人博客诚邀您加入qq群(IT-程序猿-技术交流群): 757345416丨(IT-程序猿-技术交流2群): 936929828 现在的互联网时代,二维码处处可见,这次我们研究下二维码生成 ...

  8. php判断几维数组的方法,PHP判断数组是一维二维或几维实例

    PHP判断数组是一维二维或几维实例 导语:php中比较要的一个知识点就是数组了,你对数组的.认识有多少呢?下面的是百分网小编为大家搜集的PHP判断数组是一维二维或几维实例,供大家参考. //可以判断是 ...

  9. 我在城里做运维的! 二姨:啥?

    不加班,回家过年啦! 昨天和几个运维朋友聊天 过年见亲戚,最怕被问什么? 1.没对象的:有女朋友了吗? 2.有对象的:啥时候结婚呀? 3.结了婚的:年纪不小了 该要宝宝了! 隔壁小宇告诉我,除了这三点 ...

最新文章

  1. javafx + jfoenix相关学习资料地址整理
  2. linux下I2C驱动发送IO时序,I2C驱动情景分析——怎样控制I2C时序
  3. Bootstrap3 警告框插件的使用方法
  4. mysql c#开发库_c# 开发+MySql数据库
  5. Linux 命令(26)—— rename 命令
  6. MySQL学习笔记十七:复制特性
  7. ApiCloud重新定义移动应用开发
  8. 1.啊哈!算法 --- 一大波数正在靠近——排序
  9. 决策树_Python3实现代码及注释
  10. 【git】------git的基本命令 (此文章转载我的老师 Alley-巷子)
  11. 怎么安装vs2013配套的VASSISTX番茄助手
  12. 有哪些营销书籍值得推荐?市场营销人员必读书单
  13. 仿微信通讯录的Demo----PinnedHeaderListView
  14. SVN 错误 Access to SVN Repository Forbidden的原因及解决方法
  15. 网络打印机计算机服务,Win7怎么开启打印机服务 Win7开启打印机服务方法 (全文)...
  16. “数据结构基础”系列网络课程主页
  17. JSP第四篇【EL表达式介绍、获取各类数据、11个内置对象、执行运算、回显数据、自定义函数、fn方法库】
  18. 国外LEAD第一笔收款你还记得吗
  19. 【每天学点管理】—绩效面谈的两个技巧
  20. 2. 信息系统的项目管理基础

热门文章

  1. 奇异雅可比矩阵 (BVP4c)
  2. animate.css 官方,Animate中文网
  3. 【计蒜客模拟赛系列】-计蒜客2021年8月普及组模拟赛
  4. 网络广告 之 淘宝“蓝鲸计划”和“淘宝联盟”(1)
  5. 计算机怎么恢复上一步,电脑怎么撤销上一步操作
  6. 安卓超级玛丽游戏源码完整下载
  7. 使用程序设计语言访问SQL:JDBC、从Python访问数据库、ODBC、嵌入式SQL
  8. Gogs搭建git私服-windows版
  9. SVN、Git和Perforce(P4D)的故事
  10. 【C语言程序设计】C语言求定积分!腻不腻害!