区间交

题目连接:

http://acm.hdu.edu.cn/showproblem.php?pid=5700

Description

小A有一个含有n个非负整数的数列与m个区间。每个区间可以表示为li,ri。

它想选择其中k个区间, 使得这些区间的交的那些位置所对应的数的和最大。

例如样例中,选择[2,5]与[4,5]两个区间就可以啦。

Input

多组测试数据

第一行三个数n,k,m(1≤n≤100000,1≤k≤m≤100000)。

接下来一行n个数ai,表示lyk的数列(0≤ai≤109)。

接下来m行,每行两个数li,ri,表示每个区间(1≤li≤ri≤n)。

Output

一行表示答案

Sample Input

5 2 3

1 2 3 4 6

4 5

2 5

1 4

Sample Output

10

Hint

题意

题解:

离线线段树,线段树维护区间和就好了

我暴力枚举左端点,然后每次使得在这个左端点上的区间的右端点++就好了

那么显然从i开始到这个位置的前缀和,就是这个点覆盖了多少次

那么我们通过在线段树上二分去找这个点就好了

代码

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int maxn = 1e5+7;
  4. int n,k,m;
  5. long long t[maxn*4],sum[maxn],a[maxn],l,r;
  6. vector<int> E[maxn];
  7. void build(int x,int l,int r)
  8. {
  9. t[x]=0;
  10. if(l==r)return;
  11. int mid=(l+r)/2;
  12. build(x<<1,l,mid);
  13. build(x<<1|1,mid+1,r);
  14. }
  15. void update(int x,int l,int r,int pos)
  16. {
  17. if(l==r)
  18. {
  19. t[x]++;
  20. return;
  21. }
  22. int mid=(l+r)/2;
  23. if(pos<=mid)update(x<<1,l,mid,pos);
  24. else update(x<<1|1,mid+1,r,pos);
  25. t[x]=t[x<<1]+t[x<<1|1];
  26. }
  27. int query(int x,int l,int r,int p)
  28. {
  29. if(t[x]<p)return -1;
  30. if(l==r)return l;
  31. int mid=(l+r)/2;
  32. if(p<=t[x<<1|1])return query(x<<1|1,mid+1,r,p);
  33. else return query(x<<1,l,mid,p-t[x<<1|1]);
  34. }
  35. void solve()
  36. {
  37. build(1,1,n);
  38. for(int i=1;i<=n;i++)
  39. {
  40. scanf("%lld",&a[i]);
  41. sum[i]=sum[i-1]+a[i];
  42. E[i].clear();
  43. }
  44. for(int i=1;i<=m;i++)
  45. {
  46. scanf("%d%d",&l,&r);
  47. E[l].push_back(r);
  48. }
  49. long long ans = 0;
  50. for(int i=1;i<=n;i++)
  51. {
  52. for(int j=0;j<E[i].size();j++)update(1,1,n,E[i][j]);
  53. int p=query(1,1,n,k);
  54. if(p>=i)ans=max(ans,sum[p]-sum[i-1]);
  55. }
  56. printf("%lld\n",ans);
  57. }
  58. int main()
  59. {
  60. while(cin>>n>>k>>m)
  61. solve();
  62. }

HDU 5700 区间交 离线线段树的更多相关文章

  1. HDU 5700 区间交(线段树)

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=5700 [题目大意] 给出一个长度为n的数列和m个区间,现在求k个区间,使得他们的区间交内的数列项和 ...

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

    区间交 Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submiss ...

  3. hdu 5700区间交(线段树)

    区间交 Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submiss ...

  4. HDU 5700 区间交 线段树暴力

    枚举左端点,然后在线段树内,更新所有左边界小于当前点的区间的右端点,然后查线段树二分查第k大就好 #include <cstdio> #include <cstring> #i ...

  5. HDU 3333 Turing Tree 离线 线段树/树状数组 区间求和单点修改

    题意: 给一个数列,一些询问,问你$[l,r]$之间不同的数字之和 题解: 11年多校的题,现在属于"人尽皆知傻逼题" 核心思想在于: 对于一个询问$[x,R]$ 无论$x$是什么 ...

  6. HDU 4031 Attack(离线+线段树)(The 36th ACM/ICPC Asia Regional Chengdu Site —— Online Contest)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4031 Problem Description Today is the 10th Annual of ...

  7. D. New Year and Conference(区间交,线段树)

    题:https://codeforces.com/contest/1284/problem/D 题意:给定n个1对的时间断,我是这么理解的,甲去参加a时间段的讲座,乙去参加b时间段的讲座,然后若这n对 ...

  8. hdu 4417 Super Mario 离线线段树

    思路:将点按值从小到大排序,询问按h从小到大排序. 在建立线段树,按h的大小更新树并得到该次查询的结果! 代码如下: #include<iostream> #include<stdi ...

  9. HDU 4288 Coder ( 离散化 + 离线 + 线段树 )

    这题跟ZOJ 3606的解题思路很相似. 题意:有3中操作:1.向集合中增加一个数x(1≤x≤1e9):2.从集合中删去一个数x(保证这个数存在):3.查询集合中所有位置满足i%5==3的数a[i]的 ...

随机推荐

  1. u-boot移植随笔(7):u-boot启动流程简图【转】

    转自:http://www.latelee.org/porting-uboot/u-boot-porting-bootstrap.html u-boot移植随笔:u-boot启动流程简图 画上面这张图 ...

  2. MySQL分布式集群之MyCAT(三)rule的分析【转】

    首先写在最前面,MyCAT1.4的alpha版本已经发布了,这里面修复了不少的bug,也完善了一细节,之前两篇博客已经做了一些修改 ---------------------------------- ...

  3. ajax代码示例

    function loadXMLDoc(idName,url,sendOut) { var xmlhttp; if (window.XMLHttpRequest) {// code for IE7+, ...

  4. C++如何判断大小端

    http://bbs.chinaunix.net/thread-1257205-1-1.html #include <stdio.h>#include <string.h>#i ...

  5. 【C语言学习笔记】字符串拼接的3种方法 .

    昨天晚上和@buptpatriot讨论函数返回指针(malloc生成的)的问题,提到字符串拼接,做个总结. #include<stdio.h> #include<stdlib.h&g ...

  6. MySQL学习笔记:insert into select

    从一个表复制数据插入到另外一个表,目标表中任何已存在的行都不会受影响. 语法: INSERT INTO table_xxx VALUES(); INSERT INTO table_xxx SELECT ...

  7. Linux学习笔记之一及虚拟机的安装

    学习Linux基础入门 学习实验楼Linux基础入门--学习笔记系列博客 第一节 Linux系统简介 Linux就是一个操作系统,操作系统在计算机系统中包括系统调用和内核两层.在简单了解了Linux的 ...

  8. centos killall安装

    https://blog.csdn.net/joeyon1985/article/details/46707865 https://blog.csdn.net/xupeng874395012/arti ...

  9. 2017冬季24集训模拟-2.A问题

    ————————————————————————————————————————题解 唯一没有想出来的题 我们发现以上两种操作 a0,a3,a6,a9……的相对位置不变 a1,a4,a7,a10……的 ...

  10. 黑马程序员_java基础笔记(07)...IO流

    —————————— ASP.Net+Android+IOS开发..Net培训.期待与您交流!—————————— IO(InputStream,outputStream)字节流 (Reader,Wr ...