题目:http://poj.org/problem?id=2482

大意:在一个坐标系中给你n(10^4)个点(点的坐标范围为0<=x,y<2^31),每个点有一个权值,然后给你一个长宽分别为w,h(10^6)的矩形(平行于坐标轴);
现在你的任务就是求出用这个矩形所覆盖的点的权值和的最大值(矩形边上的点不算)(矩形可以平移但是不能旋转)

思路:每个星星都可以以它自己为矩形的左下角(不能包括矩形边),那么就有n个矩形,就转化成了黑书上的第108页的题目,即统计所有1x1的小方格被覆盖的矩形最多的;

由于点的数量很小,但是坐标的范围很大,于是需要离散化;

  自左向右扫描,左右竖线(在程序中用正负表示)标志矩形进入和退出阴影区域,利用线段树进行更新;

代码:

  1 #include <iostream>
  2 #include<cstdio>
  3 #include<cstring>
  4 #include<algorithm>
  5 using namespace std;
  6 const int maxn=10010;
  7 struct node
  8 {
  9     __int64 id;//坐标值
 10     int flag;//标记左边还是右边
 11     int xh;//序号
 12 }sx[maxn*2],sy[maxn*2];
 13 struct bj
 14 {
 15     int y1,y2;
 16     int val;//左进右出,左为正,有为负
 17 }line[maxn*2];
 18 int n;
 19 int tree[maxn*8];
 20 int lz[maxn*8];//懒惰标记
 21 bool cmp(struct node a,struct node b)
 22 {
 23     if(a.id==b.id)
 24     return a.flag>b.flag;
 25     return a.id<b.id;
 26 }
 27 void disper()//离散化
 28 {
 29     sort(sx,sx+(n<<1),cmp);
 30     sort(sy,sy+(n<<1),cmp);
 31     int temp=sy[0].id;
 32     int tg=1;
 33     int i;
 34     for(i=0;i<n*2;i++)
 35     {
 36         if(temp!=sy[i].id)
 37         {
 38             tg++;
 39             temp=sy[i].id;
 40         }
 41         if(sy[i].flag)
 42         {
 43             line[sy[i].xh*2].y2=tg;
 44             line[sy[i].xh*2+1].y2=tg;
 45         }
 46         else
 47         {
 48             line[sy[i].xh*2].y1=tg;
 49             line[sy[i].xh*2+1].y1=tg;
 50         }
 51     }
 52 }
 53 void build(int l,int r,int w)
 54 {
 55     tree[w]=0;
 56     lz[w]=0;
 57     if(l==r)
 58     {
 59         return ;
 60     }
 61     int m=(l+r)>>1;
 62     build(l,m,w<<1);
 63     build(m+1,r,w<<1|1);
 64 }
 65
 66 void update(int l,int r,int w,int L,int R,int val)
 67 {
 68     if(L<=l&&R>=r)
 69     {
 70         tree[w]+=val;
 71         lz[w]+=val;//延迟标记
 72         return ;
 73     }
 74     if(lz[w]!=0)//取消标记
 75     {
 76         lz[w<<1|1]+=lz[w];
 77         lz[w<<1]+=lz[w];
 78         tree[w<<1]+=lz[w];
 79         tree[w<<1|1]+=lz[w];
 80         lz[w]=0;
 81     }
 82     int m=(l+r)>>1;
 83     if(L>m)
 84     update(m+1,r,w<<1|1,L,R,val);
 85     else if(R<=m)
 86     update(l,m,w<<1,L,R,val);
 87     else
 88     {
 89         update(l,m,w*2,L,m,val);
 90         update(m+1,r,w<<1|1,m+1,R,val);
 91     }
 92     tree[w]=max(tree[w<<1],tree[w<<1|1]);
 93 }
 94 int main()
 95 {
 96     int w,h;
 97     while(scanf("%d%d%d",&n,&w,&h)!=EOF)
 98     {
 99         int i;
100         __int64 x,y;
101         int valu;
102         for(i=0;i<n;i++)
103         {
104             scanf("%I64d%I64d%d",&x,&y,&valu);
105             sx[i<<1].id=x;
106             sx[i<<1].flag=0;//左边
107             sx[i<<1|1].id=x+w;
108             sx[i<<1|1].flag=1;//右边
109             sx[i<<1|1].xh=sx[i<<1].xh=i;
110
111             sy[i<<1].id=y;
112             sy[i<<1].flag=0;
113             sy[i<<1|1].id=y+h;
114             sy[i<<1|1].flag=1;
115             sy[i<<1|1].xh=sy[i<<1].xh=i;
116
117             line[i<<1].val=valu;
118             line[i<<1|1].val=-valu;
119         }
120         disper();//离散化
121         /*for(i=0;i<n*2;i++)
122         {
123             printf("%d %d %d\n",line[i].yd,line[i].yu,line[i].val);
124         }*/
125         n=n*2;
126         build(1,n,1);
127
128         int id;
129         int ans=0;
130         for(i=0;i<n;i++)//扫描
131         {
132             id=sx[i].xh*2+sx[i].flag;
133             line[id].y1++;//不包括边
134             update(1,n,1,line[id].y1,line[id].y2,line[id].val);
135             if(ans<tree[1])
136             ans=tree[1];
137         }
138         printf("%d\n",ans);
139     }
140     return 0;
141 }

View Code

转载于:https://www.cnblogs.com/wanglin2011/p/3150107.html

poj 2482 Stars in Your Window(线段树+离散化+线扫描)相关推荐

  1. POJ 2482 Stars in Your Window 线段树+扫描线

    妈个鸡,要不是队友提醒,我能把题面上的那封情书读完,读了一半多了都 然后题意就是,在一个平面直角坐标系上,有一些点,每个点有一个权值,用一个矩形框去框住他们,问怎么才能使框住的所有点的权值和最大,边界 ...

  2. POJ 2482 Stars in Your Window(线段树)

    POJ 2482 Stars in Your Window 题目链接 题意:给定一些星星,每一个星星都有一个亮度.如今要用w * h的矩形去框星星,问最大能框的亮度是多少 思路:转化为扫描线的问题,每 ...

  3. poj 2528 Mayor's posters(线段树+离散化)

    1 /* 2 poj 2528 Mayor's posters 3 线段树 + 离散化 4 5 离散化的理解: 6 给你一系列的正整数, 例如 1, 4 , 100, 1000000000, 如果利用 ...

  4. poj 2528 Mayor's posters(线段树 离散化 区间更新 贴海报)

         这个题目本来对大神来说可能是水题, 对我就不行了,昨晚非折腾到下半夜一点 搞定, 并且可以总结出 ,只有把问题想清楚,或着看人家解题报告自己把问题和代码思路 搞清楚,才能谈的上调bug,否则 ...

  5. poj 2482 Stars in Your Window (线段树扫描线)

    题目大意: 求一个窗体覆盖最多的星星的权值. 思路分析: 每个星星看成 左下点为x y 右上点为x+w-1 y+h-1 的矩形. 然后求出最大覆盖的和. #include <cstdio> ...

  6. 【POJ 2482】 Stars in Your Window(线段树+离散化+扫描线)

    [POJ 2482] Stars in Your Window(线段树+离散化+扫描线) Time Limit: 1000MS   Memory Limit: 65536K Total Submiss ...

  7. poj2528贴海报(线段树离散化)

    //poj2528贴海报(线段树离散化) #include<cstring> #include<iostream> #include<cstdio> #includ ...

  8. HDOJ 2492 Ping pong 线段树+离散化

    //2492 Ping pong 线段树+离散化 /* 题意: 有一陀人从左到右排成一排,每个人有一个唯一的技能值,每个人都找其他人比赛, 比赛前要再找一个人做裁判,裁判的技能值不能比这两个人都高,也 ...

  9. 线段树专辑 —— pku 2482 Stars in Your Window

    http://poj.org/problem?id=2482 A了这题后,我就在想,是不是ACMER都找不到女朋友..... 这题看似很新颖,其实就是求线段树区间最值.所谓区间最值,其实就是和RMQ差 ...

最新文章

  1. 重磅直播|大规模点云可视化技术
  2. phalcon: 解决php7/phalcon3.2以上版本,不支持oracle数据库的方法
  3. 做301定向跳转对网站优化有什么帮助?
  4. JavaScript深拷贝—我遇到的应用场景
  5. 大学计算机课程操作文档,计算机操作系统大学课程.pptx
  6. Akka入门(一)Akka简介与为什么使用Akka
  7. 第四范式推出业界首个基于持久内存、支持毫秒级恢复的万亿维线上预估系统...
  8. OpenResty(nginx)限流配置实现
  9. Windows Server 2003 出现的Service Unavailable怎么办?
  10. 更换Homebrew为中科大源
  11. java B2B2C Springboot电子商城系统-路由网关(zuul)
  12. select top语句 mysql_SQL SELECT TOP 语句
  13. Haroopad--最好用的markdown编辑器
  14. 计算机网络知识点总结(第一章 概述)
  15. uniapp:H5页面长按识别二维码
  16. mysql怎么tonumber_orcale中的to_number方法使用
  17. 【OS笔记 9】操作系统内核的功能
  18. 如何调用百度和华为的API?
  19. win10忘记密码_电脑忘记密码没关系,这招教你简单轻松改密码
  20. 抖音素材哪里下-抖音素材哪里找-短视频素材库

热门文章

  1. 如何用两种方式同时实现ListBox的滚动功能
  2. sql instr()与LOCATE()字符串查找函数
  3. 遇到 HTTP 错误 403.14 - Forbidden?
  4. JQuery 表单校验插件 validate 使用纪录
  5. 超郁闷的本地连接故障解决过程!!!
  6. CORS 请求未能成功_CORS 测试 提示错误 Reason: header authorization
  7. QEMU — VirtIO 的网络实现
  8. 5GS 协议栈 — PFCP 协议 — URR 用量上报规则
  9. VMware 接入 Openstack — 使用 Openstack 创建 vCenter 虚拟机
  10. Altium Designer唤出关掉的窗口