【51nod1672】区间交
题目大意:给定一个长度为 N 的序列,以及 M 个区间,现从中选出 K 个区间,使得这些区间的交集区间的点权和最大,求最大值是多少。
题解:
发现直接选 K 个区间不可做,考虑从答案入手。设答案区间为 [l,r],进行枚举答案区间的左端点。当前枚举到的左端点设为 L,那么能够以 L 作为左端点的区间一定满足左端点不超过 L,且右端点大于等于 L。考虑若有超过 K 个区间符合要求,那么肯定是选取较大的 K 个区间的答案更优,因此只需求出符合条件的区间右端点的第 K 大值,并更新答案即可。再考虑 L 之间的转移带来的变化,枚举到 L 时,应该将符合要求的答案更新;同样,统计完 L 的贡献之后,应该将对于 L+1 不符合情况的解删去。需要维护一个支持插入删除和求第 K 大的数据结构,显然权值线段树符合要求。
代码如下
#include <bits/stdc++.h>
#define pb push_back
using namespace std;
const int maxn=1e5+10;
typedef long long LL;
int n,m,K,sz[maxn<<2];
LL a[maxn],sum[maxn],ans;
vector<int> st[maxn],ed[maxn];
void insert(int o,int l,int r,int pos,int val){
if(l==r){sz[o]+=val;return;}
int mid=l+r>>1;
if(pos<=mid)insert(o<<1,l,mid,pos,val);
else insert(o<<1|1,mid+1,r,pos,val);
sz[o]=sz[o<<1]+sz[o<<1|1];
}
int kth(int o,int l,int r,int k){
if(l==r)return l;
int mid=l+r>>1;
if(sz[o<<1|1]>=k)return kth(o<<1|1,mid+1,r,k);
else return kth(o<<1,l,mid,k-sz[o<<1|1]);
}
void read_and_parse(){
scanf("%d%d%d",&n,&K,&m);
for(int i=1;i<=n;i++){
scanf("%lld",&a[i]);
sum[i]=sum[i-1]+a[i];
}
for(int i=1;i<=m;i++){
int l,r;
scanf("%d%d",&l,&r);
st[l].pb(r),ed[r].pb(r);
}
}
void solve(){
for(int i=1;i<=n;i++){
for(auto r:st[i])insert(1,1,n,r,1);
if(sz[1]>=K){
int pos=kth(1,1,n,K);
ans=max(ans,sum[pos]-sum[i-1]);
}
for(auto r:ed[i])insert(1,1,n,r,-1);
}
printf("%lld\n",ans);
}
int main(){
read_and_parse();
solve();
return 0;
}
【51nod1672】区间交的更多相关文章
- hdu-5700 区间交(二分+树状数组)
题目链接: 区间交 Problem Description 小A有一个含有n个非负整数的数列与mm个区间.每个区间可以表示为li,ri. 它想选择其中k个区间, 使得这些区间的交的那些 ...
- HDU 5700 区间交(线段树)
[题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=5700 [题目大意] 给出一个长度为n的数列和m个区间,现在求k个区间,使得他们的区间交内的数列项和 ...
- hdu 5700区间交(线段树)
区间交 Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submiss ...
- HDU 5700 区间交 离线线段树
区间交 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5700 Description 小A有一个含有n个非负整数的数列与m个区间.每个区间可以表示为 ...
- HDU 5700——区间交——————【线段树+枚举】
区间交 Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submiss ...
- D. New Year and Conference(区间交,线段树)
题:https://codeforces.com/contest/1284/problem/D 题意:给定n个1对的时间断,我是这么理解的,甲去参加a时间段的讲座,乙去参加b时间段的讲座,然后若这n对 ...
- HDU 5700 区间交 线段树暴力
枚举左端点,然后在线段树内,更新所有左边界小于当前点的区间的右端点,然后查线段树二分查第k大就好 #include <cstdio> #include <cstring> #i ...
- 51nod 1672 区间交(贪心)
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1672 题意: 思路:其实这就是一个经典的区间贪心问题,只需要按照左端点排 ...
- 【题解】51nod 1672区间交
二分答案 + two - pointer + 树状数组大法好ヽ(゚∀゚)メ(゚∀゚)ノ 我们可以直接二分一个答案,然后检验 是否存在一个值大于等于这个二分的答案的,且覆盖次数大于等于 \(k\) 的区 ...
随机推荐
- 利用delve(dlv)在Visual Code中进行go程序的远程调试-debug方式
最近碰到一个问题,如何在Windows的IDE或者文本编辑器上,远程调试Linux服务器上的golang程序. 虽然想说gdb走你,但既然go有dlv这样的类似Java的jdwp的原生方案,而且我用的 ...
- PJzhang:从js文件中寻找子域名的SubDomainizer
猫宁!!! 有些专门针对企业客户的网站,可能没有供公开注册的页面,但是在js文件中可能会隐藏他们的注册接口,当然这也是一种安全风险,就像有些后台是一定不能不小心放外网一个道理. 最近看到一篇文章提 ...
- 帮助文档 - Wget
(GNU Wget)http://www.gnu.org/software/wget/ 快速浏览(单HTML文件):(GNU Wget 在线手册)http://www.gnu.org/software ...
- SolidWorks学习笔记4特征
绘制斜的拉伸效果 一般拉伸方向垂直于草图基准面, 可以实现绘制一条线,作为其拉伸方向 效果如下 简单孔 在菜单中选择“插入”--“特征”---“简单直孔” 选择一个平面放置 设置好孔的直径和深度后,确 ...
- jmeter性能测试重要指标以及性能结果分析
一.Aggregate Report 是 JMeter 常用的一个 Listener,中文被翻译为“聚合报告 如果大家都是做Web应用的性能测试,例如只有一个登录的请求,那么在Aggregate Re ...
- [转帖]ORA-00600-[kcratr_nab_less_than_odr]问题小记
ORA-00600-[kcratr_nab_less_than_odr]问题小记 2018年03月12日 20:56:57 我不是VIP 阅读数 1500 https://blog.csdn.ne ...
- 自己总结的keepalived的配置流程以及注意事项
编写背景:上班时领导要求我们团队实现postgresql主备切换的高可用问题,我辅助keepalived的部分,从查资料到实施最后使用,最后编写了这个博客,水平有限,欢迎大家指正 ###postgre ...
- Django在使用Mysql迁移数据库时,会报的错
settings : DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'firstproject', ...
- 友善的树形DP
一棵树,如果有序点对(x,y)之间路径的长度取模于3==0,那么ans0便加上这个长度: 如果取模于3==1,那么ans1便加上这个长度: 如果取模于3==2,那么ans2便加上这个长度: 让你求an ...
- PermissionError: [Errno 13] Permission denied: '/run/user/0/jupyter'
解决办法:需要给/run/user整个目录开放权限,不能单独给'/run/user/0/jupyter'这个文件,因为jupyter是需要往目录中添加文件,/run/user/0/jupyter,此时 ...