【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\)次.这可以用线段树区间 ...
随机推荐
- typeof关键字简介 -rtti
typeof关键字是C语言中的一个新扩展.只要可以接受typedef名称,Sun Studio C 编译器就可以接受带有typeof的结构,包括以下语法类别: 声明 函数声明符中的参数类型链表和返回类 ...
- 批量修改string中的字符
#1,修改"/"为"\\",多用于在txt读取内容后进行修改 size_t pos0 = mkfolder.find("/");//首次查找 ...
- centos设置静态IP
1.编辑网卡文件 vi /etc/sysconfig/network-scripts/ifcfg-eth0 # eth0为网卡编号 设置网卡eth0的IPV4信息,需要注意的是,设置的IPADDR需要 ...
- 手机信号强度单位dB、dBm和asu
dB.dBm都是功率增益的单位,不同之处如下: dB是一个表征相对值的值,纯粹的比值,只表示两个量的相对大小关系,没有单位,当考虑甲的功率相比于乙功率大或小多少个dB时,按下面的计算公式:10log( ...
- DataGridView 绑定List集合后实现自定义排序
这里只贴主要代码,dataList是已添加数据的全局变量,绑定数据源 datagridview1.DataSource = dataList,以下是核心代码. 实现点击列表头实现自定义排序 priva ...
- IIS7.5开启GZip压缩
在IIS7.5选择要开启GZip压缩的网站,在功能视图中找到并双击"压缩"图标,在压缩界面中钩选"启用静态内容压缩"和"启用动态内容压缩", ...
- SqlServer中——查找杀死阻塞进程
查找阻塞进程: SELECT blocking_session_id '阻塞进程的ID', wait_duration_ms '等待时间(毫秒)', session_id '(会话ID)' FROM ...
- ipython又一方便的调试和应用工具!!!
控制台下://ipython 命令丰富 比如:ls 显示目录 ipython --pylab %run -p *.py quit关闭 示例: In []: %run -p test.py H ...
- 1118sync_binlog innodb_flush_log_at_trx_commit 浅析
转自 http://blog.itpub.net/22664653/viewspace-1063134/ innodb_flush_log_at_trx_commit和sync_binlog 两个参 ...
- SharedPreference写入-读取
SharedPreference文件保存格式为xml文件. 一.SharedPreference写入 SharedPreferences sharedPreferences = context.get ...