[51nod 1208] Stars in Your Window(线段树,扫描线)

题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1208

题意:也是矩形框点问题,不过每个点有权值,希望权值最大。

直接把出入的event中的sign变成对应权值,更新到线段树上就行了。

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 
 4 #define lrt rt << 1
 5 #define rrt rt << 1 | 1
 6 typedef struct Seg {
 7     int add, val;
 8 }Seg;
 9 typedef struct Event {
10     int l, r, h, val;
11 }Event;
12 const int maxn = 100500;
13 Seg seg[maxn<<4];
14 vector<Event> event;
15 int hh[maxn<<1], hcnt;
16 int n, w, h;
17 
18 bool cmp(Event a, Event b) {
19     if(a.h != b.h) return a.h < b.h;
20     return a.val > b.val;
21 }
22 
23 void build(int l, int r, int rt) {
24     seg[rt].val = seg[rt].add = 0;
25     if(l == r) return;
26     int mid = (l + r) >> 1;
27     build(l, mid, lrt);
28     build(mid+1, r, rrt);
29 }
30 
31 
32 void pushup(int rt) {
33     seg[rt].val = max(seg[lrt].val, seg[rrt].val);
34 }
35 
36 void pushdown(int rt) {
37     if(seg[rt].add) {
38         seg[lrt].add += seg[rt].add;
39         seg[rrt].add += seg[rt].add;
40         seg[lrt].val += seg[rt].add;
41         seg[rrt].val += seg[rt].add;
42         seg[rt].add = 0;
43     }
44 }
45 
46 void update(int L, int R, int val, int l, int r, int rt) {
47     if(L <= l && r <= R) {
48         seg[rt].add += val;
49         seg[rt].val += val;
50         return;
51     }
52     pushdown(rt);
53     int mid = (l + r) >> 1;
54     if(L <= mid) update(L, R, val, l, mid, lrt);
55     if(mid < R) update(L, R, val, mid+1, r, rrt);
56     pushup(rt);
57 }
58 
59 int id(int x) {
60     return lower_bound(hh, hh+hcnt, x) - hh + 1;
61 }
62 
63 int main() {
64     // freopen("in", "r", stdin);
65     int x, y, v;
66     while(~scanf("%d%d%d",&n,&w,&h)) {
67         event.clear(); hcnt = 0;
68         for(int i = 0; i < n; i++) {
69             scanf("%d%d%d",&x,&y,&v);
70             event.push_back(Event{x, x+w, y, v});
71             event.push_back(Event{x, x+w, y+h, -v});
72             hh[hcnt++] = x; hh[hcnt++] = x + w;
73         }
74         sort(event.begin(), event.end(), cmp);
75         sort(hh, hh+hcnt); hcnt = unique(hh, hh+hcnt) - hh;
76         build(1, hcnt, 1);
77         int ret = 0;
78         for(int i = 0; i < event.size(); i++) {
79             int l = id(event[i].l);
80             int r = id(event[i].r);
81             int val = event[i].val;
82             update(l, r, val, 1, hcnt, 1);
83             ret = max(ret, seg[1].val);
84         }
85         printf("%d\n", ret);
86     }
87     return 0;
88 }

 

转载于:https://www.cnblogs.com/kirai/p/6830658.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值