题目链接:

区间交

Problem Description
 

小A有一个含有n个非负整数的数列与mm个区间。每个区间可以表示为l​i​​,r​i​​。

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

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

Input
 

多组测试数据

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

接下来一行n个数a​i​​,表示lyk的数列(0≤a​i​​≤10​9​​)。

接下来m行,每行两个数l​i​​,r​i​​,表示每个区间(1≤l​i​​≤r​i​​≤n)。

Output
 

一行表示答案

Sample Input
 
  1. 5 2 3
  2. 1 2 3 4 6
  3. 4 5
  4. 2 5
  5. 1 4
Sample Output
 
  1. 10
  2.  
  3. 题意:
  4.  
  5. 思路:
  6.  
  7. 求相交区间和的最大值,首先是树状数组sum可以求log(n)求区间和,在找区间的时候枚举左端点,二分右端点,先把区间按左端点排序,然后一边更新一边询问,由于按左端点排序,所以左端点可以作为相交区间的左端点,二分右端点时询问这个点是否被大于等于k次覆盖,找到右端点最大的那个点,此时对应的区间就是这个左端点能得到的最大的区间,枚举完左端点就可以找到最大值了;
    复杂度好像是mlog(n)log(n);
  8.  
  9. AC代码:
  1. #include <bits/stdc++.h>
  2. /*
  3. #include <iostream>
  4. #include <queue>
  5. #include <cmath>
  6. #include <map>
  7. #include <cstring>
  8. #include <algorithm>
  9. #include <cstdio>
  10. */
  11. using namespace std;
  12. #define Riep(n) for(int i=1;i<=n;i++)
  13. #define Riop(n) for(int i=0;i<n;i++)
  14. #define Rjep(n) for(int j=1;j<=n;j++)
  15. #define Rjop(n) for(int j=0;j<n;j++)
  16. #define mst(ss,b) memset(ss,b,sizeof(ss));
  17. typedef long long LL;
  18. const LL mod=1e9+;
  19. const double PI=acos(-1.0);
  20. const int inf=0x3f3f3f3f;
  21. const int N=1e5+;
  22. int n,k,m;
  23. LL a[N];
  24. LL sum[N];
  25. int num[N];
  26. struct node
  27. {
  28. int l,r;
  29. }po[N];
  30. int cmp(node x,node y)
  31. {
  32. if(x.l==y.l)x.r>y.r;
  33. return x.l<y.l;
  34. }
  35. int lowbit(int x)
  36. {
  37. return x&(-x);
  38. }
  39. void update(int x,LL y)
  40. {
  41. while(x<=n)
  42. {
  43. sum[x]+=y;
  44. x+=lowbit(x);
  45. }
  46. }
  47. LL query(int pos)
  48. {
  49. LL ans=;
  50. while(pos>)
  51. {
  52. ans+=sum[pos];
  53. pos-=lowbit(pos);
  54. }
  55. return ans;
  56. }
  57. void update1(int x,int flag)
  58. {
  59. while(x<=n)
  60. {
  61. num[x]+=flag;
  62. x+=lowbit(x);
  63. }
  64. }
  65. int query1(int x)
  66. {
  67. int ans=;
  68. while(x>)
  69. {
  70. ans+=num[x];
  71. x-=lowbit(x);
  72. }
  73. return ans;
  74. }
  75. int check(int x)
  76. {
  77. if(query1(x)>=k)return ;
  78. return ;
  79. }
  80. int main()
  81. {
  82. while(scanf("%d%d%d",&n,&k,&m)!=EOF)
  83. {
  84. LL ans=;
  85. mst(num,);
  86. mst(sum,);
  87. Riep(n)scanf("%lld",&a[i]),update(i,a[i]);
  88. Riep(m)scanf("%d%d",&po[i].l,&po[i].r);
  89. sort(po+,po+m+,cmp);
  90. for(int i=;i<=m;i++)
  91. {
  92. update1(po[i].l,);
  93. update1(po[i].r+,-);
  94. int L=po[i].l,R=po[i].r;
  95. while(L<=R)
  96. {
  97. int mid=(L+R)>>;
  98. if(check(mid))L=mid+;
  99. else R=mid-;
  100. }
  101. LL fx=query(L-),fy;
  102. if(po[i].l>)fy=query(po[i].l-);
  103. else fy=;
  104. ans=max(ans,fx-fy);
  105. }
  106. printf("%lld\n",ans);
  107. }
  108. return ;
  109. }

hdu-5700 区间交(二分+树状数组)的更多相关文章

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

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

  2. ACM学习历程—51NOD 1685 第K大区间2(二分 && 树状数组 && 中位数)

    http://www.51nod.com/contest/problem.html#!problemId=1685 这是这次BSG白山极客挑战赛的E题. 这题可以二分答案t. 关键在于,对于一个t,如 ...

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

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

  4. 51nod 第K大区间2(二分+树状数组)

    题目链接: 第K大区间2 基准时间限制:1.5 秒 空间限制:131072 KB 分值: 160 定义一个长度为奇数的区间的值为其所包含的的元素的中位数.中位数_百度百科 现给出n个数,求将所有长度为 ...

  5. 【BZOJ3110】【整体二分+树状数组区间修改/线段树】K大数查询

    Description 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c 如果是2 a b c形式,表示询问从第a个位置到第b个位 ...

  6. 【bzoj3110】[Zjoi2013]K大数查询 整体二分+树状数组区间修改

    题目描述 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c.如果是2 a b c形式,表示询问从第a个位置到第b个位置,第C大的数 ...

  7. [bzoj1901][zoj2112][Dynamic Rankings] (整体二分+树状数组 or 动态开点线段树 or 主席树)

    Dynamic Rankings Time Limit: 10 Seconds      Memory Limit: 32768 KB The Company Dynamic Rankings has ...

  8. 【BZOJ-2527】Meteors 整体二分 + 树状数组

    2527: [Poi2011]Meteors Time Limit: 60 Sec  Memory Limit: 128 MBSubmit: 831  Solved: 306[Submit][Stat ...

  9. BZOJ_3110_[Zjoi2013]K大数查询_整体二分+树状数组

    BZOJ_3110_[Zjoi2013]K大数查询_整体二分+树状数组 Description 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位 ...

随机推荐

  1. poj 3134 Power Calculus(IDA*)

    题目大意: 用最小的步数算出  x^n 思路: 直接枚举有限步数可以出现的所有情况. 然后加一个A*   就是如果这个数一直平方  所需要的步骤数都不能达到最优   就剪掉 #include < ...

  2. oracle 学习笔记--用户管理

    oracle 用户管理 创建用户(需要具有dba权限的用户) create user 用户名 identified by 密码 defaule tablespace users     //默认表空间 ...

  3. Data Binding in WPF

    http://msdn.microsoft.com/en-us/magazine/cc163299.aspx#S1   Data Binding in WPF John Papa Code downl ...

  4. UI:target-action设计模式、手势识别器

    ⼀.target/action设计模式 ⼆.代理设计模式 三.UIImageView 四.⼿势识别器 target/action设计模式 耦合是衡量⼀个程序写的好坏的标准之⼀, 耦合是衡量模块与模块之 ...

  5. OC:习题来自平时搜索

    == 第一部分 ==  类变量的@protected ,@private,@public,@package,声明各有什么含义?写一个标准宏MIN,这个宏输入两个参数并返回较小的一个?面向对象的三大特征 ...

  6. 如何在微博侧栏中加入自己的微博[js]

    <div class="box"> <ul> <li> <object classid="clsid:D27CDB6E-AE6D ...

  7. linux环境新增用户和所属组

    1.查看用户和组信息命令: 1.1 cat /etc/passwd /etc/passwd 存储有关本地用户的信息. 1)username        UID到名称的一种映射,用户名 2)passw ...

  8. canvas 动态飞速旋转的矩形

    <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...

  9. hdu 5276 YJC tricks time 数学

    YJC tricks time Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?p ...

  10. Android 手机设置CMWAP 接入点

    Android 手机设置CMWAP 接入点 设置--- 无限控件---移动网络设置---接入点名称----再按菜单---选择新apn 第一步,设置CMNET 上网APN 新建 APN 1.名称:cmn ...