数据结构(线段树):NOI 2016 区间
【问题描述】

【输入格式】

【输出格式】

【样例输入】
6 3
3 5
1 2
3 4
2 2
1 5
1 4
【样例输出】
2
【样例说明】

【更多样例】
【样例 2 输入输出】
见目录下的 interval/interval2.in 与 interval/interval2.ans。
【样例 3 输入输出】
见目录下的 interval/interval3.in 与 interval/interval3.ans。
【子任务】

【来源】
NOI2016 Day2 T1
这道题目,第一次做我没有做出来,当时以为好难,都对NOI都失去信心了。
思路是这样的,先是一定要离散化,不然就不能处理了,接着按权值排序,用一种类似尺取法的方法去O(N)扫一遍,期间用O(logN)维护被覆盖最多次的位置被覆盖的次数。
仔细想想还是可以感觉到这个尺取法是对的……
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#define mid ((l+r)>>1)
using namespace std;
const int maxn=;
const int INF=;
int Mx[maxn<<],sum[maxn<<],ans=INF,n,m,N;
int la[maxn],lb[maxn],b[maxn],p[maxn],kl[maxn];
bool cmp(int a,int b){return kl[a]<kl[b];}
void Modify(int x,int l,int r,int a,int b,int v){
if(l>=a&&r<=b){Mx[x]+=v;sum[x]+=v;return;}
if(mid>=a)Modify(x<<,l,mid,a,b,v);
if(mid<b)Modify(x<<|,mid+,r,a,b,v);
Mx[x]=max(Mx[x<<],Mx[x<<|])+sum[x];
}
int main(){
freopen("interval.in","r",stdin);
freopen("interval.out","w",stdout);
scanf("%d%d",&n,&m);
for(int i=;i<=n;p[i]=i,i++){
scanf("%d%d",&la[i],&lb[i]);
b[++N]=la[i];b[++N]=lb[i];
kl[i]=lb[i]-la[i]+;
}
sort(p+,p+n+,cmp);sort(b+,b+N+);
N=unique(b+,b+N+)-b-;
for(int t=;t<=n;t++){int i=p[t];
la[i]=lower_bound(b+,b+N+,la[i])-b;
lb[i]=lower_bound(b+,b+N+,lb[i])-b;
}
for(int i=,j=;j<n||Mx[]==m&&j==n;){
while(Mx[]<m&&j<n)++j,Modify(,,N,la[p[j]],lb[p[j]],);
while(Mx[]==m&&i<=n)ans=min(ans,kl[p[j]]-kl[p[i]]),Modify(,,N,la[p[i]],lb[p[i]],-),i++;
}
if(ans==INF)ans=-;
printf("%d\n",ans);
return ;
}
数据结构(线段树):NOI 2016 区间的更多相关文章
- codeforces Good bye 2016 E 线段树维护dp区间合并
codeforces Good bye 2016 E 线段树维护dp区间合并 题目大意:给你一个字符串,范围为‘0’~'9',定义一个ugly的串,即串中的子串不能有2016,但是一定要有2017,问 ...
- HDU 1754 I Hate It(线段树单点替换+区间最值)
I Hate It [题目链接]I Hate It [题目类型]线段树单点替换+区间最值 &题意: 本题目包含多组测试,请处理到文件结束. 在每个测试的第一行,有两个正整数 N 和 M ( 0 ...
- HDU 3577Fast Arrangement(线段树模板之区间增减更新 区间求和查询)
Fast Arrangement Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) ...
- POJ 3468 A Simple Problem with Integers(线段树模板之区间增减更新 区间求和查询)
A Simple Problem with Integers Time Limit: 5000MS Memory Limit: 131072K Total Submissions: 140120 ...
- POJ.3321 Apple Tree ( DFS序 线段树 单点更新 区间求和)
POJ.3321 Apple Tree ( DFS序 线段树 单点更新 区间求和) 题意分析 卡卡屋前有一株苹果树,每年秋天,树上长了许多苹果.卡卡很喜欢苹果.树上有N个节点,卡卡给他们编号1到N,根 ...
- POJ.2299 Ultra-QuickSort (线段树 单点更新 区间求和 逆序对 离散化)
POJ.2299 Ultra-QuickSort (线段树 单点更新 区间求和 逆序对 离散化) 题意分析 前置技能 线段树求逆序对 离散化 线段树求逆序对已经说过了,具体方法请看这里 离散化 有些数 ...
- HDU.1394 Minimum Inversion Number (线段树 单点更新 区间求和 逆序对)
HDU.1394 Minimum Inversion Number (线段树 单点更新 区间求和 逆序对) 题意分析 给出n个数的序列,a1,a2,a3--an,ai∈[0,n-1],求环序列中逆序对 ...
- hdu 1166线段树 单点更新 区间求和
敌兵布阵 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
- hdu2795(线段树单点更新&区间最值)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2795 题意:有一个 h * w 的板子,要在上面贴 n 条 1 * x 的广告,在贴第 i 条广告时要 ...
- hdu1754(线段树单点替换&区间最值模板)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1754 题意:中文题诶- 思路:线段树单点替换&区间最大值查询模板 代码: #include & ...
随机推荐
- android学习笔记----JNI中的c控制java
面向对象的底层实现 java作为面向对象高级语言,可对现实世界进行建模.和面向过程不同的是面向对象软件的编写不是流程的堆积,而是对业务逻辑的多视角分解和分类.其过程大致为: 1).将知识分解 ...
- ubuntu环境配置之vi 配置【转载】
ubuntu环境配置之vi 配置 [日期:2014-02-10] 来源:Linux社区 作者:zhonghe1114 [字体:大 中 小] Android的源码开发,几乎离不开Linux,Lin ...
- MySQL - 复制数据表
假设现在有张数据表 users: CREATE TABLE users ( userid ) UNSIGNED NOT NULL, username ) UNIQUE, passwd ) ', PRI ...
- python爬虫scrapy的Selectors参考文档
http://doc.scrapy.org/en/1.0/topics/selectors.html#topics-selectors-htmlcode
- java的各个队列之间的联系和区别是什么
java的各个并发队列之间的联系和区别 java.util.concurrent是在并发编程中很常用的实用工具类 ArrayBlockingQueue, DelayQueue, LinkedBlock ...
- java 进制.
/* 整数的'3'种表现形式: 1,十进制. 2,八进制. 3,十六进制. */ public class IntegerDemo { public static void main(String[] ...
- Struts2 中拦截器和Action的调用关系(写的很好)
http://blog.csdn.net/hackerain/article/details/6991082
- Topas命令详解
Topas命令详解 执行topas命令后如图所示: #topas 操作系统的最全面动态,而又查看方便的性能视图就是topas命令了,下面以topas输出为例,对AIX系统的性能监控做简要描述,供运维工 ...
- 【转】 ios开发之倒计时实现的两种方法
原文:http://blog.csdn.net/kylinbl/article/details/8972261 方法1:使用NSTimer来实现 主要使用的是NSTimer的scheduledTime ...
- PAT - 基础 - 最大公约数和最小公倍数
题目: 本题要求两个给定正整数的最大公约数和最小公倍数. 输入格式: 输入在一行中给出2个正整数M和N(<=1000). 输出格式: 在一行中顺序输出M和N的最大公约数和最小公倍数,两数字间以1 ...