hdu-5700 区间交(二分+树状数组)
题目链接:
区间交
小A有一个含有n个非负整数的数列与mm个区间。每个区间可以表示为li,ri。
它想选择其中k个区间, 使得这些区间的交的那些位置所对应的数的和最大。
例如样例中,选择[2,5]与[4,5]两个区间就可以啦。
多组测试数据
第一行三个数n,k,m(1≤n≤100000,1≤k≤m≤100000)。
接下来一行n个数ai,表示lyk的数列(0≤ai≤109)。
接下来m行,每行两个数li,ri,表示每个区间(1≤li≤ri≤n)。
一行表示答案
- 5 2 3
- 1 2 3 4 6
- 4 5
- 2 5
- 1 4
- 10
- 题意:
- 思路:
- 求相交区间和的最大值,首先是树状数组sum可以求log(n)求区间和,在找区间的时候枚举左端点,二分右端点,先把区间按左端点排序,然后一边更新一边询问,由于按左端点排序,所以左端点可以作为相交区间的左端点,二分右端点时询问这个点是否被大于等于k次覆盖,找到右端点最大的那个点,此时对应的区间就是这个左端点能得到的最大的区间,枚举完左端点就可以找到最大值了;
复杂度好像是mlog(n)log(n);- AC代码:
- #include <bits/stdc++.h>
- /*
- #include <iostream>
- #include <queue>
- #include <cmath>
- #include <map>
- #include <cstring>
- #include <algorithm>
- #include <cstdio>
- */
- using namespace std;
- #define Riep(n) for(int i=1;i<=n;i++)
- #define Riop(n) for(int i=0;i<n;i++)
- #define Rjep(n) for(int j=1;j<=n;j++)
- #define Rjop(n) for(int j=0;j<n;j++)
- #define mst(ss,b) memset(ss,b,sizeof(ss));
- typedef long long LL;
- const LL mod=1e9+;
- const double PI=acos(-1.0);
- const int inf=0x3f3f3f3f;
- const int N=1e5+;
- int n,k,m;
- LL a[N];
- LL sum[N];
- int num[N];
- struct node
- {
- int l,r;
- }po[N];
- int cmp(node x,node y)
- {
- if(x.l==y.l)x.r>y.r;
- return x.l<y.l;
- }
- int lowbit(int x)
- {
- return x&(-x);
- }
- void update(int x,LL y)
- {
- while(x<=n)
- {
- sum[x]+=y;
- x+=lowbit(x);
- }
- }
- LL query(int pos)
- {
- LL ans=;
- while(pos>)
- {
- ans+=sum[pos];
- pos-=lowbit(pos);
- }
- return ans;
- }
- void update1(int x,int flag)
- {
- while(x<=n)
- {
- num[x]+=flag;
- x+=lowbit(x);
- }
- }
- int query1(int x)
- {
- int ans=;
- while(x>)
- {
- ans+=num[x];
- x-=lowbit(x);
- }
- return ans;
- }
- int check(int x)
- {
- if(query1(x)>=k)return ;
- return ;
- }
- int main()
- {
- while(scanf("%d%d%d",&n,&k,&m)!=EOF)
- {
- LL ans=;
- mst(num,);
- mst(sum,);
- Riep(n)scanf("%lld",&a[i]),update(i,a[i]);
- Riep(m)scanf("%d%d",&po[i].l,&po[i].r);
- sort(po+,po+m+,cmp);
- for(int i=;i<=m;i++)
- {
- update1(po[i].l,);
- update1(po[i].r+,-);
- int L=po[i].l,R=po[i].r;
- while(L<=R)
- {
- int mid=(L+R)>>;
- if(check(mid))L=mid+;
- else R=mid-;
- }
- LL fx=query(L-),fy;
- if(po[i].l>)fy=query(po[i].l-);
- else fy=;
- ans=max(ans,fx-fy);
- }
- printf("%lld\n",ans);
- }
- return ;
- }
hdu-5700 区间交(二分+树状数组)的更多相关文章
- hdu 5700区间交(线段树)
区间交 Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submiss ...
- ACM学习历程—51NOD 1685 第K大区间2(二分 && 树状数组 && 中位数)
http://www.51nod.com/contest/problem.html#!problemId=1685 这是这次BSG白山极客挑战赛的E题. 这题可以二分答案t. 关键在于,对于一个t,如 ...
- HDU 5700 区间交 线段树暴力
枚举左端点,然后在线段树内,更新所有左边界小于当前点的区间的右端点,然后查线段树二分查第k大就好 #include <cstdio> #include <cstring> #i ...
- 51nod 第K大区间2(二分+树状数组)
题目链接: 第K大区间2 基准时间限制:1.5 秒 空间限制:131072 KB 分值: 160 定义一个长度为奇数的区间的值为其所包含的的元素的中位数.中位数_百度百科 现给出n个数,求将所有长度为 ...
- 【BZOJ3110】【整体二分+树状数组区间修改/线段树】K大数查询
Description 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c 如果是2 a b c形式,表示询问从第a个位置到第b个位 ...
- 【bzoj3110】[Zjoi2013]K大数查询 整体二分+树状数组区间修改
题目描述 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c.如果是2 a b c形式,表示询问从第a个位置到第b个位置,第C大的数 ...
- [bzoj1901][zoj2112][Dynamic Rankings] (整体二分+树状数组 or 动态开点线段树 or 主席树)
Dynamic Rankings Time Limit: 10 Seconds Memory Limit: 32768 KB The Company Dynamic Rankings has ...
- 【BZOJ-2527】Meteors 整体二分 + 树状数组
2527: [Poi2011]Meteors Time Limit: 60 Sec Memory Limit: 128 MBSubmit: 831 Solved: 306[Submit][Stat ...
- BZOJ_3110_[Zjoi2013]K大数查询_整体二分+树状数组
BZOJ_3110_[Zjoi2013]K大数查询_整体二分+树状数组 Description 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位 ...
随机推荐
- poj 3134 Power Calculus(IDA*)
题目大意: 用最小的步数算出 x^n 思路: 直接枚举有限步数可以出现的所有情况. 然后加一个A* 就是如果这个数一直平方 所需要的步骤数都不能达到最优 就剪掉 #include < ...
- oracle 学习笔记--用户管理
oracle 用户管理 创建用户(需要具有dba权限的用户) create user 用户名 identified by 密码 defaule tablespace users //默认表空间 ...
- Data Binding in WPF
http://msdn.microsoft.com/en-us/magazine/cc163299.aspx#S1 Data Binding in WPF John Papa Code downl ...
- UI:target-action设计模式、手势识别器
⼀.target/action设计模式 ⼆.代理设计模式 三.UIImageView 四.⼿势识别器 target/action设计模式 耦合是衡量⼀个程序写的好坏的标准之⼀, 耦合是衡量模块与模块之 ...
- OC:习题来自平时搜索
== 第一部分 == 类变量的@protected ,@private,@public,@package,声明各有什么含义?写一个标准宏MIN,这个宏输入两个参数并返回较小的一个?面向对象的三大特征 ...
- 如何在微博侧栏中加入自己的微博[js]
<div class="box"> <ul> <li> <object classid="clsid:D27CDB6E-AE6D ...
- linux环境新增用户和所属组
1.查看用户和组信息命令: 1.1 cat /etc/passwd /etc/passwd 存储有关本地用户的信息. 1)username UID到名称的一种映射,用户名 2)passw ...
- canvas 动态飞速旋转的矩形
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...
- hdu 5276 YJC tricks time 数学
YJC tricks time Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?p ...
- Android 手机设置CMWAP 接入点
Android 手机设置CMWAP 接入点 设置--- 无限控件---移动网络设置---接入点名称----再按菜单---选择新apn 第一步,设置CMNET 上网APN 新建 APN 1.名称:cmn ...