0
点赞
收藏
分享

微信扫一扫

Stars in Your Window POJ - 2482

​​http://poj.org/problem?id=2482​​

和hdu5091基本一样 做法也差不多

但是叶节点的选择不太一样 if(l+1==r) return;

这道题要求如果星星在边框上就不算 所以肯定不能把边框对齐某个星星 而应该介于两颗星星之间的那个线段上

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define ll long long

struct node1
{
ll l;
ll r;
ll h;
ll val;
};

struct node2
{
ll l;
ll r;
ll val;
ll laz;
};

node1 seg[20010];
node2 tree[80010];
ll tmp[20010];
ll w,h;
int n,len;

bool cmp(node1 n1,node1 n2)
{
if(n1.h==n2.h) return n1.val<n2.val;
else return n1.h<n2.h;
}

void pushup(int cur)
{
tree[cur].val=max(tree[2*cur].val,tree[2*cur+1].val);
}

void pushdown(int cur)
{
if(tree[cur].laz!=0)
{
tree[2*cur].val+=tree[cur].laz;
tree[2*cur].laz+=tree[cur].laz;
tree[2*cur+1].val+=tree[cur].laz;
tree[2*cur+1].laz+=tree[cur].laz;
tree[cur].laz=0;
}
}

void build(int l,int r,int cur)
{
int m;
tree[cur].l=tmp[l];
tree[cur].r=tmp[r];
tree[cur].val=0;
tree[cur].laz=0;
if(l+1==r) return;
m=(l+r)/2;
build(l,m,2*cur);
build(m,r,2*cur+1);
}

void update(ll pl,ll pr,ll val,int cur)
{
if(pl<=tree[cur].l&&tree[cur].r<=pr)
{
tree[cur].val+=val;
tree[cur].laz+=val;
return;
}
pushdown(cur);
if(pl<tree[2*cur].r) update(pl,pr,val,2*cur);
if(pr>tree[2*cur+1].l) update(pl,pr,val,2*cur+1);
pushup(cur);
}

int main()
{
ll x,y,val,ans;
int i;
while(scanf("%d%lld%lld",&n,&w,&h)!=EOF)
{
for(i=1;i<=n;i++)
{
scanf("%lld%lld%lld",&x,&y,&val);
seg[2*i-1].l=x,seg[2*i-1].r=x+w,seg[2*i-1].h=y,seg[2*i-1].val=val;
seg[2*i].l=x,seg[2*i].r=x+w,seg[2*i].h=y+h,seg[2*i].val=-val;
tmp[2*i-1]=x,tmp[2*i]=x+w;
}
sort(seg+1,seg+2*n+1,cmp);
sort(tmp+1,tmp+2*n+1);
len=unique(tmp+1,tmp+2*n+1)-tmp-1;
build(1,len,1);
ans=0;
for(i=1;i<=2*n;i++)
{
//printf("*%lld %lld %lld*\n",seg[i].l,seg[i].r,seg[i].val);
update(seg[i].l,seg[i].r,seg[i].val,1);
ans=max(ans,tree[1].val);
}
printf("%lld\n",ans);
}
return 0;
}

 


举报

相关推荐

0 条评论