题面

题意

平面坐标系有nnn个点,第iii个点的坐标为(xi,yi)(x_i,y_i)(xi​,yi​),每个点有个权值wiw_iwi​,现在你需要寻找一个矩形把某些点圈起来使得他们的权值和最大。

思路

先把各点的纵坐标离散化,然后把所有的点按照横坐标从小到大排序,枚举矩形的左边界,每加入一个新的点,就把它对应纵坐标yyy的权值和w[y]w[y]w[y]更新并更改右边界,当左右边界都确定以后,利用线段树求得纵坐标的最大连续子段和,不断更新答案。复杂度O(n2log(n))O(n^2log(n))O(n2log(n)),注意每次枚举左边界都需要重新建树。

代码:

#include<bits/stdc++.h>using namespace std;
const long long N = 10000;
struct node{long long x,y,w;
}s[N];
bool cmp(node a,node b){return a.x<b.x;
}
long long yy[N];
long long w[N];
long long L[N<<1],R[N<<1],S[N<<1],MX[N<<1];
void pushup(long long rt){S[rt]=S[rt<<1]+S[rt<<1|1];MX[rt]=max(L[rt<<1|1]+R[rt<<1],max(MX[rt<<1],MX[rt<<1|1]));L[rt]=max(L[rt<<1],L[rt<<1|1]+S[rt<<1]);R[rt]=max(R[rt<<1|1],R[rt<<1]+S[rt<<1|1]);
}
void bt(long long rt,long long l,long long r){if(l==r){L[rt]=R[rt]=S[rt]=MX[rt]=0;return ;}long long mid=(l+r)>>1;bt(rt<<1,l,mid);bt(rt<<1|1,mid+1,r);pushup(rt);
}
void update(long long pos,long long x,long long l,long long r,long long rt){if(l==r){MX[rt]=L[rt]=R[rt]=max(0LL,x);S[rt]=x;return ;}long long mid=(l+r)>>1;if(pos<=mid) update(pos,x,l,mid,rt<<1);else update(pos,x,mid+1,r,rt<<1|1);pushup(rt);
}
int main(){long long T;scanf("%lld",&T);while(T--){memset(yy,0,sizeof(yy));int  n;scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%lld %lld %lld",&s[i].x,&s[i].y,&s[i].w);yy[i]=s[i].y;}sort(yy+1,yy+n+1);int m=unique(yy+1,yy+n+1)-yy-1;for(int i=1;i<=n;i++){s[i].y=lower_bound(yy+1,yy+m+1,s[i].y)-yy;}sort(s+1,s+n+1,cmp);long long ans=0;for(int i=1;i<=n;i++){//枚举左边界if(i==1||s[i].x!=s[i-1].x){bt(1,1,m);for(int j=1;j<=m;j++) w[j]=0;for(int j=i;j<=n;j++){//右边界w[s[j].y]+=s[j].w;update(s[j].y,w[s[j].y],1,m,1);if(s[j].x!=s[j+1].x||j==n) ans=max(ans,MX[1]);}}}printf("%lld\n",ans);}return 0;
}

【HDU 6638】Snowy Smile(线段树求区间连续最大和)相关推荐

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

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

  2. 2016 Multi-University Training Contest 10 [HDU 5861] Road (线段树:区间覆盖+单点最大小)...

    HDU 5861 题意 在n个村庄之间存在n-1段路,令某段路开放一天需要交纳wi的费用,但是每段路只能开放一次,一旦关闭将不再开放.现在给你接下来m天内的计划,在第i天,需要对村庄ai到村庄bi的道 ...

  3. hdu 5919--Sequence II(主席树--求区间不同数个数+区间第k大)

    题目链接 Problem Description Mr. Frog has an integer sequence of length n, which can be denoted as a1,a2 ...

  4. 线段树求区间和(单点更新)

    题目1:敌兵布阵  线段树的主要操作:(1)建立线段树(Build)          (2)更新区间值 (Update)           (3)查询区间(Query) 写法一: #include ...

  5. hdu3074 线段树求区间乘积(单点更新)

    题意:       给你n个数,两种操作,(1) 把第b个数改成c (2)算出b-c的乘积,结果对1000000007取余. 思路:       线段树单点更新,简单题目,不多解释,具体看代码. #i ...

  6. HDU 3308 线段树求区间最长连续上升子序列长度

    题意:两种操作,Q L R查询L - R 的最长连续上升子序列长度,U pos val 单点修改值 #include <bits/stdc++.h> #define N 100005 us ...

  7. Distinct Characters Queries CodeForces - 1234D(线段树求区间字母种类数)

    You are given a string ss consisting of lowercase Latin letters and qq queries for this string. Reca ...

  8. 线段树求区间最大值RMQ(单点更新)

    题目:HDU1754 #include <stdio.h> #define maxn 222222 #define lson l,m,rt<<1 #define rson m+ ...

  9. C++实现线段树求区间和-区间查询

    代码如下: #include <iostream> using namespace std; const int N = 10010; int input[N];struct node { ...

  10. Can you answer these queries I SPOJ - GSS1 (线段树维护区间连续最大值/最大连续子段和)...

    You are given a sequence A[1], A[2], ..., A[N] . ( |A[i]| ≤ 15007 , 1 ≤ N ≤ 50000 ). A query is defi ...

最新文章

  1. JAVA遇见HTML——JSP篇(JSP内置对象上)
  2. python词云图代码示例 无jieba_【词云图】如何用python的第三方库jieba和wordcloud画词云图...
  3. 高效管理 GitHub Star,用这几个插件就能做到!
  4. [方法提炼] 获取Android设备序列号方法
  5. opc调试软件_组态王和三菱OPC软件完美演绎天塔之光
  6. linux修改默认python版本_Linux 升级 Python 并修改默认版本
  7. c++实验8 哈夫曼编码-译码器
  8. Apache下的配置文件httpd.conf、httpd-vhosts.conf 转
  9. [转载].NET开发常用的10条实用代码
  10. java apdu读取社保卡_读取社保卡信息
  11. 浅谈C++中的LPVOID类型
  12. android 隐藏应用程序,AppHider隐藏应用
  13. 转型只争朝夕!又一火电企业成立新能源公司
  14. android依赖本地工程排除,Android Gradle依赖项排除(Android Gradle dependency exclude)
  15. Inkscape制作logo
  16. C++课程设计指导书
  17. OSPF单区域配置【eNSP实现】
  18. 普渡机器人服务北京大学
  19. NiFi 的使用心得
  20. 用几何语言表示线段ab的中点c,根据下列语句画出图形:(1)过图甲线段AB的中点C,作CD⊥AB;(2)点P...

热门文章

  1. java.util 语言_java中的import java.util是什么意思
  2. 一个基于igv.js实现的python脚本,实现简单的网页版IGV
  3. #微信公众号互联登录-01#
  4. 计算机工程师对社会报答什么,报答作文400字(精选10篇)
  5. 在windows中桌面显示itunes音乐滚动歌词
  6. TLD(Tracking-Learning-Detection)一种目标跟踪算法(相关资料很全)
  7. 在html中嵌入java_在html中嵌入java swing
  8. 同一个无线局域网(wifi)内,两台电脑无法通过ip通信
  9. vue -lic 搭建vue项目
  10. zabbix web监控 一: zabbix3.2添加web页面监控(Web monitoring)