luogu1712 区间 (尺取法+线段树)
先把区间按照长度从小到大排序,然后用尺取法来做
大概就是先一点一点把区间算上 直到某个点被覆盖了m次,然后一点一点把最前面的区间扔掉,直到没有点被覆盖m次,这样反复做(相当于是它选择的区间左右端点在那里摩擦)
判断有没有点被覆盖m次可以用线段树来做
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=; inline int read(){
char c=getchar();int a=;
while(c<''||c>'') c=getchar();
while(c>=''&&c<=''){a=a*+c-'';c=getchar();}
return a;
} struct ST{
int x,id;bool isl;
}nd[maxn*];
struct Line{
int l,r,siz;
}ln[maxn];
struct Node{
int l,r,num,laz;
}tr[maxn*]; int M,N; inline bool cmp1(ST a,ST b){return a.x<b.x;}
inline bool cmp2(Line a,Line b){return a.siz<b.siz;} void build(int i,int l,int r){
tr[i].l=l;tr[i].r=r;tr[i].num=tr[i].laz=;
if(l>=r) return;
int m=(l+r)>>;build(i<<,l,m);build(+(i<<),m+,r);
} inline void pushdown(int i){
if(!tr[i].laz) return;
if(tr[i].l==tr[i].r){tr[i].laz=;return;}
int l=i<<,r=(i<<)+;
tr[l].num+=tr[i].laz;tr[r].num+=tr[i].laz;
tr[l].laz+=tr[i].laz;tr[r].laz+=tr[i].laz;
tr[i].laz=;return;
}
inline void update(int i){if(tr[i].l<tr[i].r)tr[i].num=max(tr[i<<].num,tr[(i<<)+].num);} void add(int i,int l,int r,int x){
if(tr[i].l==l&&tr[i].r==r){tr[i].num+=x;tr[i].laz+=x;return;}
int m=(tr[i].l+tr[i].r)>>;pushdown(i);
if(l<=m) add(i<<,l,min(m,r),x);
if(r>m) add((i<<)+,max(l,m+),r,x);
update(i);
} int main(){
int i,j,k,ans=0x7fffffff;
N=read();M=read();
for(i=;i<=N;i++){
ln[i].l=read();ln[i].r=read();ln[i].siz=ln[i].r-ln[i].l;
nd[i].x=ln[i].l;nd[i].id=i;nd[i].isl=;
nd[i+N].x=ln[i].r;nd[i+N].id=i;nd[i+N].isl=;
}sort(nd+,nd+N*+,cmp1);
for(i=,j=;i<=N*;i++){
if(nd[i].x!=nd[i-].x) j++;
if(nd[i].isl) ln[nd[i].id].l=j;
else ln[nd[i].id].r=j;
}sort(ln+,ln+N+,cmp2); build(,,N*);
for(i=,j=;i<=N;i++){
add(,ln[i].l,ln[i].r,);
if(tr[].num>=M){
while(tr[].num>=M){j++;add(,ln[j].l,ln[j].r,-);}
ans=min(ans,ln[i].siz-ln[j].siz);
}
}
if(ans!=0x7fffffff) printf("%d",ans);
else printf("-1");
}
luogu1712 区间 (尺取法+线段树)的更多相关文章
- 洛谷P1712 [NOI2016]区间 尺取法+线段树+离散化
洛谷P1712 [NOI2016]区间 noi2016第一题(大概是签到题吧,可我还是不会) 链接在这里 题面可以看链接: 先看题意 这么大的l,r,先来个离散化 很容易,我们可以想到一个结论 假设一 ...
- codeforces 652C C. Foe Pairs(尺取法+线段树查询一个区间覆盖线段)
题目链接: C. Foe Pairs time limit per test 1 second memory limit per test 256 megabytes input standard i ...
- luogu P1712 [NOI2016]区间 贪心 尺取法 线段树 二分
LINK:区间 没想到尺取法. 先说暴力 可以发现答案一定可以转换到端点处 所以在每个端点从小到大扫描线段就能得到答案 复杂度\(n\cdot m\) 再说我的做法 想到了二分 可以进行二分答案 从左 ...
- BZOJ4653 尺取法 + 线段树
https://www.lydsy.com/JudgeOnline/problem.php?id=4653 首先很容易想到离散之后排序,用线段树或者树状数组去维护. 问题在于按照什么排序,如果按照左端 ...
- 线段树:CDOJ1597-An easy problem C(区间更新的线段树)
An easy problem C Time Limit: 4000/2000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Pr ...
- 【NOI2016】区间 题解(线段树+尺取法)
题目链接 题目大意:给定$n$个区间$[l_i,r_i]$,选出$m$个区间使它们有一个共同的位置$x$,且使它们产生的费用最小.求最小费用.费用定义为最长的区间长度减去最短区间长度. ------- ...
- NOI2016区间bzoj4653(线段树,尺取法,区间离散化)
题目描述 在数轴上有 \(N\) 个闭区间 \([l_1,r_1],[l_2,r_2],...,[l_n,r_n]\) .现在要从中选出 \(M\) 个区间,使得这 \(M\) 个区间共同包含至少一个 ...
- HDU 4553 约会安排 (区间合并)【线段树】
<题目链接> 寒假来了,又到了小明和女神们约会的季节. 小明虽为屌丝级码农,但非常活跃,女神们常常在小明网上的大段发言后热情回复“呵呵”,所以,小明的最爱就是和女神们约会.与此同时,也有 ...
- HDU 1540 Tunnel Warfare(经典)(区间合并)【线段树】
<题目链接> 题目大意: 一个长度为n的线段,下面m个操作 D x 表示将单元x毁掉 R 表示修复最后毁坏的那个单元 Q x 询问这个单元以及它周围有多少个连续的单元,如果它本身已经被 ...
随机推荐
- [Oracle][PDB]PDB restore/recover 过程记录
友人给的PDB restore / recover 的过程. 实际上会创建一个辅助Instance,然后抽取出PDB,进行恢复. (10:31:59) frank.yan: [Administrato ...
- RNN介绍,较易懂
人类并不是每时每刻都从一片空白的大脑开始他们的思考.在你阅读这篇文章时候,你都是基于自己已经拥有的对先前所见词的理解来推断当前词的真实含义.我们不会将所有的东西都全部丢弃,然后用空白的大脑进行思考.我 ...
- C#一些常用的图片操作方法:生成文字图片 合并图片等
生成文字图片: /// <summary> /// 生成文字图片 /// </summary> /// <param name="text">& ...
- [已解决]An unhandled exception occurred while processing the request.
An unhandled exception occurred while processing the request. InvalidOperationException: The layout ...
- jackjson-databind-2.9.3 笔记
问题 客户端请求: {"skip":0,"take":10,"corpName":"","cityCode&q ...
- Keepalived基础知识-运维小结
keepalived介绍keepalived观察其名可知,保持存活,在网络里面就是保持在线了,也就是所谓的高可用或热备,它集群管理中保证集群高可用的一个服务软件,其功能类似于heartbeat,用来防 ...
- LVS+Keepalived 高可用环境部署记录(主主和主从模式)
之前的文章介绍了LVS负载均衡-基础知识梳理, 下面记录下LVS+Keepalived高可用环境部署梳理(主主和主从模式)的操作流程: 一.LVS+Keepalived主从热备的高可用环境部署 1)环 ...
- 对于windows 10使用感受
windows 10是美国微软公司研发的新一代跨平台及设备应用的操作系统.在2015年7月29日12点起,windows 10推送全面开始,windows 7.windows 8 用户可以升级到win ...
- sql server选取第m行到第n行的元组
现在有一个表Questioin,主码是qid,要求选择第m行到第n行的元组 //方法一:效率最低 //错误:如果n<m,将选取前n条数据,如果n>=m,将选取从m+1开始的n条数据 sel ...
- #个人博客作业Week1——浏览教材后提出的六个问题及软件与软件工程的提出。
1.通常,我们阅读软件比编写软件花费的时间更多.正因为编写软件比阅读软件要容易,因此代码的可读性显得尤为重要.那么我们在写程序时应该如何避免多余的,带有误导性的注释,写出一个利于帮助别人读懂程序的注释 ...