【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\)次.这可以用线段树区间 ...
随机推荐
- zlog学习笔记(level_list)
level_list.h /** * */ #ifndef __zlog_level_list_h #define __zlog_level_list_h zc_arraylist_t *zlog_l ...
- php常用自定义函数
1,写一个函数,算出两个文件的相对路径 有两种方法,一种是利用array的相关方法,如例1,另外一种是使用?:;运算符 先看第一种方法 function getrelativepath2($path1 ...
- JavaScript中的this关键字
在JavaScript中,函数的this关键字的行为与其他语言相比有很多不同.在JavaScript的严格模式和非严格模式下也略有区别. 在绝大多数情况下,函数的调用方式决定了this的值.this不 ...
- [py]简易pick lucky num程序
程序功能: 1,用户输入数字,当用户输入指定数字时候,输出他输入的循环那次 2,第二次询问是否还要输 3,如果no 则 终止 4,如果yes则继续输入 判断输入是否大于首次输入的 如果大于则开始循环输 ...
- uploadify firefox 401
uploadify在firefox下上传会报401错误:这是因为java的框架把其拦截了 拦截的原因是,firefox下的flash在请求和发送请求的时候不会携带cookie和session过去,造成 ...
- MVC-RedirectToAction跳转到其他Area
mvc使用Area分区开发后,存在不同Area之间的跳转,需要为每个区间添加Area规则,如下: using System.Web.Mvc; namespace web.Areas.FrameSet ...
- 【算法之美】求解两个有序数组的中位数 — leetcode 4. Median of Two Sorted Arrays
一道非常经典的题目,Median of Two Sorted Arrays.(PS:leetcode 我已经做了 190 道,欢迎围观全部题解 https://github.com/hanzichi/ ...
- canvas中的碰撞检测笔记
用 canvas 做小游戏或者特效,碰撞检测是少不了的.本文将会涉及普通的碰撞检测,以及像素级的碰撞检测.(本文的碰撞检测均以矩形为例) 普通碰撞检测 普通的矩形碰撞检测比较简单.即已知两个矩形的各顶 ...
- css+div 浮动分块
前段时间学过几天html,只是怀着了解的态度,能够读懂别人的页面,能够扒现成就行,一直没有自己动手去实践过,其实也不是没有实践过,前段时间扒了一个网页,想按照自己的要求来改,可后果是越改越乱.今天心血 ...
- 又发现个.net framework的坑
请找出这两个方法的区别: http://msdn.microsoft.com/en-us/library/ms584187(v=vs.110).aspx