【BZOJ-4653】区间 线段树 + 排序 + 离散化
4653: [Noi2016]区间
Time Limit: 60 Sec Memory Limit: 256 MB
Submit: 107 Solved: 70
[Submit][Status][Discuss]
Description
Input
Output
Sample Input
3 5
1 2
3 4
2 2
1 5
1 4
Sample Output
HINT
Source
Solution
比较简单的题
显然先对区间左右端点进行离散化
考虑按区间长度排序,用双指针统计答案
排序后,由于单调性,答案显然是两段连续的区间,那么扫一遍区间,判断多个区间是否有交M即可
用数据结构去维护多个区间求交,显然线段树即可
基本的操作:区间修改,总体查询最大
然后每次到达M更新答案即可
Code
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
using namespace std;
int read()
{
int x=,f=; char ch=getchar();
while (ch<'' || ch>'') {if (ch=='-') f=-; ch=getchar();}
while (ch>='' && ch<='') {x=x*+ch-''; ch=getchar();}
return x*f;
}
#define MAXN 500100
int N,M,ls[MAXN<<],tp,top;
struct QNode{int l,r,sz;}q[MAXN<<];
struct SegmentTreeNode{int l,r,tag,maxx;}tree[MAXN<<];
inline void Update(int now) {tree[now].maxx=max(tree[now<<].maxx,tree[now<<|].maxx);}
void Pushdown(int now)
{
if (!tree[now].tag) return;
int D=tree[now].tag; tree[now].tag=;
tree[now<<].maxx+=D; tree[now<<|].maxx+=D;
tree[now<<].tag+=D; tree[now<<|].tag+=D;
}
void Change(int now,int l,int r,int L,int R,int D)
{
if (L<=l && R>=r) {tree[now].tag+=D; tree[now].maxx+=D; return;}
Pushdown(now);
int mid=(l+r)>>;
if (L<=mid) Change(now<<,l,mid,L,R,D);
if (R>mid) Change(now<<|,mid+,r,L,R,D);
Update(now);
}
bool cmp(QNode A,QNode B) {return A.sz<B.sz;}
int Solve()
{
int re=0x7fffffff,dfn=;
sort(q+,q+N+,cmp);
for (int i=; i<=N; i++)
{
while (tree[].maxx<M)
{
if (dfn==N) return re;
dfn++;
Change(,,top,q[dfn].l,q[dfn].r,);
}
re=min(q[dfn].sz-q[i].sz,re);
Change(,,top,q[i].l,q[i].r,-);
}
return re;
}
int main()
{
N=read(),M=read();
for (int i=; i<=N; i++)
ls[++tp]=q[i].l=read(),ls[++tp]=q[i].r=read(),q[i].sz=q[i].r-q[i].l;
sort(ls+,ls+tp+);
ls[top]=-;
for (int i=; i<=tp; i++) if (ls[i]!=ls[top]) ls[++top]=ls[i];
for (int i=; i<=N; i++)
q[i].l=lower_bound(ls+,ls+top+,q[i].l)-ls,q[i].r=lower_bound(ls+,ls+top+,q[i].r)-ls;
int Ans=Solve();
printf("%d\n",Ans==0x7fffffff? -:Ans);
return ;
}
由于同步赛的时候就想到了正解,并且打了一遍,放学前花10分钟又码了一遍...
一开始线段树写了个建树...最后几个点RE成狗.....然后回到最初辣鸡版本,把建树扔了就轻松A了....
被DCrusher大爷嘲讽了一顿
同步赛好像也是这么写的,应该能A?
【BZOJ-4653】区间 线段树 + 排序 + 离散化的更多相关文章
- BZOJ4653 [NOI2016]区间 [线段树,离散化]
题目传送门 区间 Description 在数轴上有 n个闭区间 [l1,r1],[l2,r2],...,[ln,rn].现在要从中选出 m 个区间,使得这 m个区间共同包含至少一个位置.换句话说,就 ...
- BZOJ 3110 ZJOI 2013 K大数查询 树套树(权值线段树套区间线段树)
题目大意:有一些位置.这些位置上能够放若干个数字. 如今有两种操作. 1.在区间l到r上加入一个数字x 2.求出l到r上的第k大的数字是什么 思路:这样的题一看就是树套树,关键是怎么套,怎么写.(话说 ...
- hdu1542 Atlantis (线段树+扫描线+离散化)
Atlantis Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total S ...
- [BZOJ 4025]二分图(线段树分治+带边权并查集)
[BZOJ 4025]二分图(线段树分治+带边权并查集) 题面 给出一个n个点m条边的图,每条边会在时间s到t出现,问每个时间的图是否为一个二分图 \(n,m,\max(t_i) \leq 10^5\ ...
- hdu 1540 Tunnel Warfare (区间线段树(模板))
http://acm.hdu.edu.cn/showproblem.php?pid=1540 Tunnel Warfare Time Limit: 4000/2000 MS (Java/Others) ...
- BZOJ.4184.shallot(线段树分治 线性基)
BZOJ 裸的线段树分治+线性基,就是跑的巨慢_(:з」∠)_ . 不知道他们都写的什么=-= //41652kb 11920ms #include <map> #include < ...
- 【bzoj3110】[Zjoi2013]K大数查询 权值线段树套区间线段树
题目描述 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c.如果是2 a b c形式,表示询问从第a个位置到第b个位置,第C大的数 ...
- 【Luogu】P2824排序(二分答案+线段树排序)
题目链接 震惊!两个线段树和一个线段树竟是50分的差距! 本题可以使用二分答案,二分那个位置上最后是什么数.怎么验证呢? 把原序列改变,大于等于mid的全部变成1,小于mid的全部变成0,之后线段树排 ...
- BZOJ.4653.[NOI2016]区间(线段树)
BZOJ4653 UOJ222 考虑二分.那么我们可以按区间长度从小到大枚举每个区间,对每个区间可以得到一个可用区间长度范围. 我们要求是否存在一个点被这些区间覆盖至少\(m\)次.这可以用线段树区间 ...
随机推荐
- C语言--scanf
关于C语言的scanf,首先看个例子 int get_int(void){ int input; char ch; ){ printf("is not an integer,please e ...
- Anterior and posterior commissures
Source: https://en.wikipedia.org/wiki/Posterior_commissure Figrues archive.
- 【WPF】TextBox样式重写注意事项
1.普通控件重写需要添加一行 <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="C ...
- Burndown chart
S型的燃尽图 在一次milestone开发过程中,开发者会持续编辑issue列表,每个issue都有自己的生命周期.燃尽图预期这些issues会被线性的消灭掉,所以从第一天直接到最后一天画个直线表示预 ...
- 小记sql server临时表与表变量的区别
临时表与表变量都可以起到“临时”的作用,那么两者主要的区别是什么呢? 这里不讨论创建方式,以及全局临时表.会话临时表这些,主要记录一下个人对两者的主要区别以及适用情况的看法,有什么不对或补充的地方,欢 ...
- 此utf8 非彼utf8 ——谈http协议里的编码问题
我这里看两个编码: BDPAGETYPE:2BDQID:0xc92b034d0bc985e8BDUSERID:809441751 Cache-Control:private Connection:Ke ...
- Entity Framework与ADO.Net及NHibernate的比较
Entity Framework 是微软推荐出.NET平台ORM开发组件, EF相对于ado.net 的优点 (1)开发效率高,Entity Framework的优势就是拥有更好的LINQ提供程序. ...
- Ubuntu更改右键菜单
方法/步骤1.这是我们在桌面文件夹ubuntugege上打开的右键菜单,你说你在~/.gnome2/nautilus-scripts/添加的右键菜单项目但它就是没有显示呀,于是你觉得Ubuntu 12 ...
- IOS_SearchBar搜索栏及关键字高亮
搜索框的效果演示: 这个就是所谓的搜索框了,那么接下来我们看看如何使用代码来实现这个功能. 我所使用的数据是英雄联盟的英雄名单,是一个JSON数据的txt文件, JSON数据的处理代码如下所示: ? ...
- 模块加载(require)及定义(define)时的路径
最近新公司在用requireJS进行JS的整合,刚开始接触有点蒙,于是深入了解了一下.requireJS主要是为了解决一下两个问题: (1)实现js文件的异步加载,避免网页失去响应: (2)管理模块之 ...