区间交

题目连接:

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开始到这个位置的前缀和,就是这个点覆盖了多少次

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

代码

#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5+7;
int n,k,m;
long long t[maxn*4],sum[maxn],a[maxn],l,r;
vector<int> E[maxn];
void build(int x,int l,int r)
{
t[x]=0;
if(l==r)return;
int mid=(l+r)/2;
build(x<<1,l,mid);
build(x<<1|1,mid+1,r);
}
void update(int x,int l,int r,int pos)
{
if(l==r)
{
t[x]++;
return;
}
int mid=(l+r)/2;
if(pos<=mid)update(x<<1,l,mid,pos);
else update(x<<1|1,mid+1,r,pos);
t[x]=t[x<<1]+t[x<<1|1];
}
int query(int x,int l,int r,int p)
{
if(t[x]<p)return -1;
if(l==r)return l;
int mid=(l+r)/2;
if(p<=t[x<<1|1])return query(x<<1|1,mid+1,r,p);
else return query(x<<1,l,mid,p-t[x<<1|1]);
}
void solve()
{
build(1,1,n);
for(int i=1;i<=n;i++)
{
scanf("%lld",&a[i]);
sum[i]=sum[i-1]+a[i];
E[i].clear();
}
for(int i=1;i<=m;i++)
{
scanf("%d%d",&l,&r);
E[l].push_back(r);
}
long long ans = 0;
for(int i=1;i<=n;i++)
{
for(int j=0;j<E[i].size();j++)update(1,1,n,E[i][j]);
int p=query(1,1,n,k);
if(p>=i)ans=max(ans,sum[p]-sum[i-1]);
}
printf("%lld\n",ans);
}
int main()
{
while(cin>>n>>k>>m)
solve();
}

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. Mysql_Learning_Notes_系统结构_1_数据类型

    数据类型 整型 1.tinyint 1Bytes -128~127(255) 2.smallint 2Bytes -32768~32676(65535) 3.mdeiumint 3Bytes -838 ...

  2. quartz的一个误导

    quartz文档提到,如果在集群环境下,最好将配置项org.quartz.jobStore.txIsolationLevelSerializable设置为true 问题: 这个选项在mysql下会非常 ...

  3. angular 如何使用第三方组件ng-bootstrap

    1.在你的项目中以下指令    npm install --save @ng-bootstrap/ng-bootstrap 安装完成会显示 + @ng-bootstrap/ng-bootstrap@1 ...

  4. java基础24 线程、多线程及线程的生命周期(Thread)

    1.1.进程 正在执行的程序称作为一个进程.进程负责了内存空间的划分 疑问1:windows电脑称之为多任务的操作系统,那么Windows是同时运行多个应用程序呢? 从宏观的角度:windows确实在 ...

  5. No.16 selenium学习之路之异常处理

    一.常见的几种异常: SyntaxError:语法错误 NameError:试图访问的变量名不存在 IndexError:索引错误,使用的索引不存在,超出序列范围 KeyError:使用了不存在的关键 ...

  6. xcode7 创建pch文件

    1.打开xcode 7.2 项目,在屏幕顶端的工具栏,选择File>New>File..>iOS>Other>PCH File,点击"next"下一步 ...

  7. Linux学习笔记:ps -ef、ps aux、kill -9

    一.查看进程命令 1.ps命令 Linux中的ps命令是Process Status的缩写. ps命令用来列出系统中当前运行的那些进程. ps命令列出的是当前那些进程的快照,就是执行ps命令的那个时刻 ...

  8. MySQL学习笔记:时间差

    1.MySQL计算同一张表中同一列的时间差,同一个id,有多个时间,求出每个id最早时间和最晚时间之间的差值. 原始表如下: 查询语句: SELECT id, MAX(TIME), MIN(TIME) ...

  9. 有关c语言编程

    有关C语言编程 统计代码"行数" 对于统计代码"行数",行数不包括空白行和注释行.程序改进如下: while(fgets (mystring , 100 , f ...

  10. Python 让两个print()函数的输出打印在一行内

    1.两个连续的print()函数为什么在输出时内容会分行显示? 解:print()中有两个默认参数 sep 和 end,其中sep是代替分隔符,end是代替末尾的换行符,默认使用‘,’代替空格,且默认 ...