# POJ 2482 Stars in Your Window (线段树区间合并+扫描线)

#include<set>
#include<map>
#include<queue>
#include<stack>
#include<cmath>
#include<vector>
#include<string>
#include<cstdio>
#include<cstring>
#include<stdlib.h>
#include<iostream>
#include<algorithm>
using namespace std;
#define eps 1E-8
/*注意可能会有输出-0.000*/
#define Sgn(x) (x<-eps? -1 :x<eps? 0:1)//x为两个浮点数差的比较,注意返回整型
#define Cvs(x) (x > 0.0 ? x+eps : x-eps)//浮点数转化
#define zero(x) (((x)>0?(x):-(x))<eps)//判断是否等于0
#define mul(a,b) (a<<b)
#define dir(a,b) (a>>b)
typedef long long ll;
typedef unsigned long long ull;
const int Inf=1<<28;
const double Pi=acos(-1.0);
const int Max=10010;
map<ll,int> mp;//离散化成1到coun
struct node
{
ll bri;
ll xx1,yy1;
} poi[Max];
struct nide
{
ll lmax,rmax,mmax,sum;
void init(ll num)
{
sum=lmax=rmax=mmax=num;
}
} segtr[Max*2<<2]; //再多开一倍空间
bool cmp1(struct node p1,struct node p2)
{
return p1.xx1<p2.xx1;
}
ll nmax(ll a,ll b)
{
return a>b?a:b;
}
void Upnow(int now,int next)
{
segtr[now].sum=segtr[next].sum+segtr[next|1].sum;
segtr[now].lmax=nmax(segtr[next].lmax,segtr[next].sum+segtr[next|1].lmax);
segtr[now].rmax=nmax(segtr[next|1].rmax,segtr[next|1].sum+segtr[next].rmax);
segtr[now].mmax=nmax(nmax(segtr[next].mmax,segtr[next|1].mmax),segtr[next].rmax+segtr[next|1].lmax);
return;
}
void Create(int sta,int enn,int now)
{
if(sta==enn)
{
segtr[now].init(0ll);
return;
}
int mid=dir(sta+enn,1);
int next=mul(now,1);
Create(sta,mid,next);
Create(mid+1,enn,next|1);
Upnow(now,next);
return;
}
void Update(int sta,int enn,int now,int x,ll y)
{
if(sta==enn&&sta==x)
{
segtr[now].sum+=y;
segtr[now].lmax+=y;
segtr[now].rmax+=y;
segtr[now].mmax+=y;
return;
}
int mid=dir(sta+enn,1);
int next=mul(now,1);
if(mid>=x)
Update(sta,mid,next,x,y);
else
Update(mid+1,enn,next|1,x,y);
Upnow(now,next);
return;
}
int main()
{
ll n,w,h;
while(~scanf("%lld %lld %lld",&n,&w,&h))
{
for(int i=0; i<n; i++)
scanf("%lld %lld %lld",&poi[i].xx1,&poi[i].yy1,&poi[i].bri);
mp.clear();
for(int i=0; i<n; i++)//建树前离散化y轴
{
mp[poi[i].yy1]=0;
mp[poi[i].yy1+h]=0;
}
int coun=1;
map<ll,int>::iterator it;
for(it=mp.begin(); it!=mp.end(); ++it)
it->second=coun++;
coun--;
Create(1,coun,1);
int j=0;//双指针作为扫描线
ll manx=0;
sort(poi,poi+n,cmp1);
for(int i=0; i<n; i++) //关键：模拟树状数组的区间更新，后面对应位置加一个负的亮度，则就求最大区间和
{
Update(1,coun,1,mp[poi[i].yy1],poi[i].bri);//加点
Update(1,coun,1,mp[poi[i].yy1+h],-poi[i].bri);//枚举的点
while(i!=j&&poi[i].xx1-poi[j].xx1>=w)
{
Update(1,coun,1,mp[poi[j].yy1],-poi[j].bri);//删点
Update(1,coun,1,mp[poi[j].yy1+h],poi[j].bri);
j++;
}
manx=nmax(manx,segtr[1].mmax);
}
printf("%lld\n",manx);
}
return 0;
}



• 本文已收录于以下专栏：

## POJ 2482 Stars in Your Window(线段树扫描线)

• u012965890
• 2014年08月22日 18:57
• 1278

## poj 2482 Stars in Your Window 扫描线 线段树

• zp___waj
• 2017年04月14日 17:43
• 209

## poj 2482 Stars in Your Window （线段树扫描线）

• u010709592
• 2014年07月20日 10:00
• 586

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

• code12hour
• 2016年03月17日 19:43
• 198

## poj 2482 Stars in Your Window 线段树 扫描线

• xc19952007
• 2016年03月16日 11:07
• 275

## 【POJ 2482】Stars in Your Window（扫描线+线段树）

• reverie_mjp
• 2016年08月18日 10:38
• 147

## poj 2482 Stars in Your Window(线段树，扫描线)

poj 2482 Stars in Your Window 题意，用一个矩形qu
• fallenfall
• 2014年05月05日 12:22
• 573

## POJ 2482 Stars in Your Window (线段树扫描线)

• u012891242
• 2015年08月14日 17:08
• 483

## poj 2482 Stars in Your Window(线段树+扫描线)

http://poj.org/problem?id=2482 题意：给出n个星星的坐标的亮度，一个矩形的宽和长，分别是w和h。问这个矩形能够框住的星星的最大亮度是多少。 看的解题报告，愧疚中。。。...
• u013081425
• 2014年02月17日 18:53
• 688

## 【POJ】2482 Stars in Your Window 线段树 + 扫描线

Stars in Your Window Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9...
• u013368721
• 2014年07月13日 16:34
• 776

举报原因： 您举报文章：POJ 2482 Stars in Your Window (线段树区间合并+扫描线) 色情 政治 抄袭 广告 招聘 骂人 其他 (最多只允许输入30个字)