洛谷$P1712\ [NOI2016]$区间 线段树
正解:线段树
解题报告:
$umm$很久以前做的了来补个题解$QwQ$
考虑给每个区间按权值($r-l$从大往小排序,依次加入,然后考虑如果有一个位置被覆盖次数等于$m$了就可以把权值最大的那个删去直到被覆盖次数小于$m$,顺便更新答案
然后就做完辣!$QwQ$
放下代码趴,然后因为是去年的代码了所以码风可能有点丑,,,懒得改了$QwQ$
$over$
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
int n,m,b[],c[],d[],mx[],add[],l=,r=,ans=0x7fffffff,num;
struct seg
{
int x,y,len;
inline bool operator <(const seg& rhs) const
{
return len>rhs.len;
}
}a[];
inline int read()
{
char ch=getchar();int x=;
while(ch>'' || ch<'')ch=getchar();
while(ch<='' && ch>='')x=(x<<)+(x<<)+(ch^''),ch=getchar();
return x;
}
inline void ins(int l,int r,int x,int y,int k,int v)
{
if (x<=l&&y>=r)
{
add[k]+=v;
mx[k]+=v;
return;
}
int mid=l+r>>;
if (x<=mid) ins(l,mid,x,y,k<<,v);
if (y>mid) ins(mid+,r,x,y,k<<|,v);
mx[k]=max(mx[k<<],mx[k<<|]);
mx[k]+=add[k];
}
int low(int x)
{
int l=,r=num,mid;
while (l<r)
{
mid=(l+r)>>;
if (b[mid]>=x) r=mid;
else l=mid+;
}
return l;
}
int main()
{
n=read(),m=read();
num=;
for (int i=;i<=n;i++)
{
a[i].x=read();
a[i].y=read();
a[i].len=a[i].y-a[i].x;
b[++num]=a[i].x;
b[++num]=a[i].y;
}
sort(a+,a+n+);
sort(b+,b+num+);
for (int i=;i<=n;i++) a[i].x=low(a[i].x),a[i].y=low(a[i].y);
for (int r=;r<=n;r++)
{
ins(,num,a[r].x,a[r].y,,);
while (mx[]>=m)
{
ans=min(ans,a[l].len-a[r].len);
ins(,num,a[l].x,a[l].y,,-);
l++;
}
}
if (ans!=0x7fffffff) printf("%d\n",ans);
else printf("-1");
return ;
}
洛谷$P1712\ [NOI2016]$区间 线段树的更多相关文章
- Luogu P1712 [NOI2016]区间(线段树)
P1712 [NOI2016]区间 题意 题目描述 在数轴上有 \(N\) 个闭区间 \([l_1,r_1],[l_2,r_2],...,[l_n,r_n]\) .现在要从中选出 \(M\) 个区间, ...
- 洛谷P1712 [NOI2016]区间 尺取法+线段树+离散化
洛谷P1712 [NOI2016]区间 noi2016第一题(大概是签到题吧,可我还是不会) 链接在这里 题面可以看链接: 先看题意 这么大的l,r,先来个离散化 很容易,我们可以想到一个结论 假设一 ...
- hdu 1540 Tunnel Warfare (区间线段树(模板))
http://acm.hdu.edu.cn/showproblem.php?pid=1540 Tunnel Warfare Time Limit: 4000/2000 MS (Java/Others) ...
- BZOJ 3110 ZJOI 2013 K大数查询 树套树(权值线段树套区间线段树)
题目大意:有一些位置.这些位置上能够放若干个数字. 如今有两种操作. 1.在区间l到r上加入一个数字x 2.求出l到r上的第k大的数字是什么 思路:这样的题一看就是树套树,关键是怎么套,怎么写.(话说 ...
- 【bzoj3110】[Zjoi2013]K大数查询 权值线段树套区间线段树
题目描述 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c.如果是2 a b c形式,表示询问从第a个位置到第b个位置,第C大的数 ...
- 洛谷 P1712 [NOI2016]区间(线段树)
传送门 考虑将所有的区间按长度排序 考虑怎么判断点被多少区间覆盖,这个可以离散化之后用一棵权值线段树来搞 然后维护两个指针$l,r$,当被覆盖次数最多的点的覆盖次数小于$m$时不断右移$r$,在覆盖次 ...
- 洛谷P3372/poj3468(线段树lazy_tag)(询问区间和,支持区间修改)
洛谷P3372 //线段树 询问区间和,支持区间修改 #include <cstdio> using namespace std; struct treetype { int l,r; l ...
- 【BZOJ】1012: [JSOI2008]最大数maxnumber /【洛谷】1198(线段树)
Description 现在请求你维护一个数列,要求提供以下两种操作:1. 查询操作.语法:Q L 功能:查询当前数列中末尾L个数中的最大的数,并输出这个数的值.限制:L不超过当前数列的长度.2. 插 ...
- 洛谷题解P4314CPU监控--线段树
题目链接 https://www.luogu.org/problemnew/show/P4314 https://www.lydsy.com/JudgeOnline/problem.php?id=30 ...
随机推荐
- Python基础:02数字
1:Python标准整数类型等价于C的(有符号)长整型.整数一般以十进制表示,但是Python也支持八进制或十六进制来表示整数.八进制整数以数字“0”开始, 十六进制整数则以“0x”或“0X”开始. ...
- CH1401 兔子与兔子
#include<bits/stdc++.h> using namespace std; ,p=; typedef unsigned long long ULL;//自然溢出 ULL f[ ...
- DataTable CAST 成集合后,进行自定义排序再转换回DataTable
dt = dt.Rows.Cast<DataRow>().OrderBy(r => Convert.ToInt32(r["数量"])==0?1:0).ThenBy ...
- @codeforces - 1205C@ Palindromic Paths
目录 @description@ @solution@ @accepted code@ @details@ @description@ 这是一道交互题. 现在有一个 n*n 的矩阵,每个位置是 0 或 ...
- css3 word-wrap属性
允许长单词换行到下一行: word-wrap:break-word
- 2018-8-10-git-使用-VisualStudio-比较分支更改
title author date CreateTime categories git 使用 VisualStudio 比较分支更改 lindexi 2018-08-10 19:16:52 +0800 ...
- 【t065】最敏捷的机器人
Time Limit: 1 second Memory Limit: 128 MB [问题描述] [背景] Wind设计了很多机器人.但是它们都认为自己是最强的,于是,一场比赛开始了~ [问题描述] ...
- Adam那么棒,为什么还对SGD念念不忘 (1) —— 一个框架看懂优化算法
机器学习界有一群炼丹师,他们每天的日常是: 拿来药材(数据),架起八卦炉(模型),点着六味真火(优化算法),就摇着蒲扇等着丹药出炉了. 不过,当过厨子的都知道,同样的食材,同样的菜谱,但火候不一样了, ...
- php表单加入Token防止重复提交的方法分析
http://www.jb51.net/article/94395.htm 这篇文章主要介绍了php表单加入Token防止重复提交的方法,结合实例形式分析了Token防止重复提交的原理与使用技巧,需要 ...
- 2018-8-10-git-提交添加-emoij-文字
title author date CreateTime categories git 提交添加 emoij 文字 lindexi 2018-08-10 19:16:52 +0800 2018-2-1 ...