HDU 5700 区间交(线段树)

题目链接 区间交

 1 #include <bits/stdc++.h>
 2
 3 using namespace std;
 4
 5 #define rep(i, a, b)    for (int i(a); i <= (b); ++i)
 6 #define dec(i, a, b)    for (int i(a); i >= (b); --i)
 7
 8 #define lson i << 1, L, mid
 9 #define rson i << 1 | 1, mid + 1, R
10
11 typedef long long LL;
12
13 const int N = 200010;
14
15 struct node{
16         int l, r;
17         friend bool operator < (const node &a, const node &b){
18             return a.l < b.l;
19         }
20 } a[N];
21
22 int tree[N << 2];
23 int n, k, m;
24 LL sum[N], ans, x;
25
26 void pushup(int i){ tree[i] = tree[i << 1] + tree[i << 1 | 1];  }
27
28
29 void update(int i, int L, int R, int x){
30         if (L == R){ ++tree[i]; return;}
31         int mid = (L + R) >> 1;
32         if (x <= mid) update(lson, x); else update(rson, x);
33         pushup(i);
34 }
35
36 int query(int i, int L, int R, int x){
37         if (L == R) return L;
38         int mid = (L + R) >> 1;
39         if (tree[i << 1 | 1] >= x) return query(rson, x);
40         else return query(lson, x - tree[i << 1 | 1]);
41 }
42
43 int main(){
44
45         while (~scanf("%d%d%d", &n, &k, &m)){
46             sum[0] = 0; ans = 0;
47             memset(tree, 0, sizeof tree);
48             rep(i, 1, n){
49                     scanf("%lld", &x);
50                     sum[i] = sum[i - 1] + x;
51             }
52
53             rep(i, 1, m) scanf("%d%d", &a[i].l, &a[i].r);
54             sort(a + 1, a + m + 1);
55             dec(i, k, 1) update(1, 1, n, a[i].r);
56             a[m + 1].r = 1;
57             rep(i, k, m){
58                     int pos = query(1, 1, n, k);
59                     if (pos >= a[i].l) ans = max(ans, sum[pos] - sum[a[i].l - 1]);
60                     update(1, 1, n, a[i + 1].r);
61             }
62
63             printf("%lld\n", ans);
64         }
65         return 0;
66 }
时间: 2024-11-20 16:22:21

HDU 5700 区间交(线段树)的相关文章

hdu 5700区间交(线段树)

区间交 Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 849    Accepted Submission(s): 377 Problem Description 小A有一个含有n个非负整数的数列与m个区间.每个区间可以表示为li,ri. 它想选择其中k个区间, 使得这些区间的交的那些位置所对应的数的和最大. 例如样例中,选择[2,5]

HDU 5700 区间交 线段树暴力

枚举左端点,然后在线段树内,更新所有左边界小于当前点的区间的右端点,然后查线段树二分查第k大就好 #include <cstdio> #include <cstring> #include <algorithm> using namespace std; typedef long long LL; const int N = 100005; LL a[N]; struct Node{ int l,r; bool operator<(const Node &

HDU 5700——区间交——————【线段树+枚举】

区间交 Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 567    Accepted Submission(s): 279 Problem Description 小A有一个含有n个非负整数的数列与m个区间.每个区间可以表示为li,ri. 它想选择其中k个区间, 使得这些区间的交的那些位置所对应的数的和最大. 例如样例中,选择[2,5]

HDU 1823 二维线段树(区间max)

Luck and Love Time Limit: 10000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 5262    Accepted Submission(s): 1317 Problem Description 世界上上最远的距离不是相隔天涯海角而是我在你面前可你却不知道我爱你                ―― 张小娴 前段日子,枫冰叶子给Wiskey做了

hdu 2665 可持久化线段树求区间第K大值(函数式线段树||主席树)

http://acm.hdu.edu.cn/showproblem.php?pid=2665 Problem Description Give you a sequence and ask you the kth big number of a inteval. Input The first line is the number of the test cases. For each test case, the first line contain two integer n and m (

HDU 3074-Multiply game(线段树:单点更新,区间求积)

Multiply game Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1450    Accepted Submission(s): 508 Problem Description Tired of playing computer games, alpc23 is planning to play a game on numbe

HDU 4902 Nice boat(线段树)

HDU Nice boat 题目链接 题意:给定一个序列,两种操作,把一段变成x,把一段每个数字,如果他大于x,就变成他和x的gcd,求变换完后,最后的序列. 思路:线段树,每个结点多一个cover表示该位置以下区间是否数字全相同,然后每次延迟操作,最后输出的时候单点查询即可 代码: #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int N = 1

hdu 2795 Billboard(线段树)

Billboard Time Limit: 20000/8000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 10890    Accepted Submission(s): 4827 Problem Description At the entrance to the university, there is a huge rectangular billboard of

HDU 3954 Level up 线段树

---NotOnlySuccess 出的题--- 看了题之后觉得和HDU 4027有点像,给的K很小,只有10,目测只要有人升级的时候直接更新到叶子节点就ok了.不过不同于HDU 4027 的是,那题每一次更新都相当于这题的一次升级操作,这题里面可能会出现一次操作之后没有升级和出现升级两种情况,一时半会没了思路. 无奈去搜题解,发现我只要维护一个区间当中距离升级最近的人所需要的基础升级经验,即不算等级加成的裸的升级经验,如果在一次涨经验之后,出现当前区间当中有人会升级,直接将每一个要升级的人更新