HihoCoder 1590 : 紧张的会议室(区间最大+离散化)
描述
小Hi的公司最近员工增长迅速,同时大大小小的会议也越来越多;导致公司内的M间会议室非常紧张。
现在小Hi知道公司目前有N个会议,其中第i个会议的时间区间是(Si, Ei)。 注意这里时间区间可以视为是开区间,也就是说(3, 5)和(5, 6)不会被视为是同时进行的会议。
小Hi想知道如果他新增一个会议,时间区间是(X, Y),会不会导致出现会议室不够用的情况?
已知目前的N个会议不会导致会议室不够用。
输入
第一行包含两个整数:N和M。
以下N行每行两个整数Si和Ei,代表一个会议的时间区间。
之后一行包含一个整数Q,代表小Hi询问的次数。
以下Q行每行包含两个整数Xi和Yi,表示小Hi希望新增的会议时间。
对于30%的数据,1 <= N, M, Q <= 1000
对于100%的数据,1 <= N, M, Q <= 100000 0 <= Si < Ei <= 100000000 0 <= Xi < Yi <= 100000000
输出
对于每一次询问,输出YES或者NO。YES代表会议室够用,NO代表会议室不够用。
- 样例输入
-
3 1
1 2
3 4
5 6
2
2 3
2 4 - 样例输出
-
YES
NO
思路: 前缀和性质,[x,y]覆盖,则sum[x]++,sum[y+1]--,正好题目给定的是左开右闭[x,y),则直接离散化,求区间最大。
开始用树状数组,一直超时。后来改成倍增就ok了。
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;
const int maxn=;
int x[maxn],y[maxn],s[maxn],e[maxn],sum[maxn],q[maxn];
int tmp,tmp2,cnt,R[maxn],dp[maxn][];
int max(int a,int b){ if(a>b) return a; return b;}
int read()
{
int res=; char c=getchar();
while(c>''||c<'') c=getchar();
while(c>=''&&c<=''){res=res*+c-''; c=getchar(); }
return res;
}
int RMQ()
{
for(int i=;i<=cnt;i++) dp[i][]=sum[i];
for(int i=;i<;i++)
for(int j=;j+(<<i)<cnt;j++)
dp[j][i]=max(dp[j][i-],dp[j+(<<(i-))][i-]);
}
int query(int l,int r)
{
int k=log2(r-l+);
return max(dp[l][k],dp[r-(<<k)+][k]);
}
int main()
{
int N,M,Q,i,j,Max=;
scanf("%d%d",&N,&M);
for(i=;i<=N;i++){
scanf("%d%d",&s[i],&e[i]);
s[i]++; e[i]++;
q[++cnt]=s[i];
q[++cnt]=e[i];
}
scanf("%d",&Q);
for(i=;i<=Q;i++){
scanf("%d%d",&x[i],&y[i]);
x[i]++; y[i]++;
q[++cnt]=x[i];
q[++cnt]=y[i];
}
sort(q+,q+cnt+);
unique(q+,q+cnt+);
for(i=;i<=N;i++){
tmp=lower_bound(q+,q+cnt+,s[i])-q; sum[tmp]++;
tmp=lower_bound(q+,q+cnt+,e[i])-q; sum[tmp]--;
}
for(i=;i<=cnt;i++) {
sum[i]+=sum[i-];
Max=max(Max,sum[i]);
}
RMQ();
for(i=;i<=Q;i++){
tmp=lower_bound(q+,q+cnt+,x[i])-q;
tmp2=lower_bound(q+,q+cnt+,y[i])-q;
if(query(tmp,tmp2-)<M) printf("YES\n");
else printf("NO\n");
}
return ;
}
超时代码:
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;
const int maxn=;
int x[maxn],y[maxn],s[maxn],e[maxn],sum[maxn],q[maxn];
int tmp,tmp2,cnt,R[maxn];
int max(int a,int b){ if(a>b) return a; return b;}
int read()
{
int res=; char c=getchar();
while(c>''||c<'') c=getchar();
while(c>=''&&c<=''){res=res*+c-''; c=getchar(); }
return res;
}
void add(int i,int val)
{
while(i<=cnt){
R[i]=max(R[i],val);
i+=(-i)&i;
}
}
int query(int l,int r)
{
int res=;
while(l<=r&&r){
while(r-(-r)&r>=l&&r) {
res=max(res,R[r]);
r-=(-r)&r;
}
if(r>=l) res=max(res,sum[r--]);
} return res;
}
int main()
{
int N,M,Q,i,j,Max=;
scanf("%d%d",&N,&M);
for(i=;i<=N;i++){
scanf("%d%d",&s[i],&e[i]);
s[i]++; e[i]++;
q[++cnt]=s[i];
q[++cnt]=e[i];
}
scanf("%d",&Q);
for(i=;i<=Q;i++){
scanf("%d%d",&x[i],&y[i]);
x[i]++; y[i]++;
q[++cnt]=x[i];
q[++cnt]=y[i];
}
sort(q+,q+cnt+);
unique(q+,q+cnt+);
for(i=;i<=N;i++){
tmp=lower_bound(q+,q+cnt+,s[i])-q; sum[tmp]++;
tmp=lower_bound(q+,q+cnt+,e[i])-q; sum[tmp]--;
}
for(i=;i<=cnt;i++) {
sum[i]+=sum[i-];
add(i,sum[i]);
Max=max(Max,sum[i]);
}
for(i=;i<=Q;i++){
if(Max>M) printf("NO\n");
else {
tmp=lower_bound(q+,q+cnt+,x[i])-q;
tmp2=lower_bound(q+,q+cnt+,y[i])-q;
if(query(tmp,tmp2-)<M) printf("YES\n");
else printf("NO\n");
}
}
return ;
}
HihoCoder 1590 : 紧张的会议室(区间最大+离散化)的更多相关文章
- hiho 1590 - 紧张的会议室。区间问题
题目链接 小Hi的公司最近员工增长迅速,同时大大小小的会议也越来越多:导致公司内的M间会议室非常紧张. 现在小Hi知道公司目前有N个会议,其中第i个会议的时间区间是(Si, Ei). 注意这里时间区间 ...
- POJ-2528 Mayor's posters (线段树区间更新+离散化)
题目分析:线段树区间更新+离散化 代码如下: # include<iostream> # include<cstdio> # include<queue> # in ...
- POJ 2528 Mayor's posters (线段树+区间覆盖+离散化)
题意: 一共有n张海报, 按次序贴在墙上, 后贴的海报可以覆盖先贴的海报, 问一共有多少种海报出现过. 题解: 因为长度最大可以达到1e7, 但是最多只有2e4的区间个数,并且最后只是统计能看见的不同 ...
- hiho一下21周 线段树的区间修改 离散化
离散化 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho在回国之后,重新过起了朝7晚5的学生生活,当然了,他们还是在一直学习着各种算法~ 这天小Hi和小Ho ...
- POJ 2528 Mayor's posters(线段树/区间更新 离散化)
题目链接: 传送门 Mayor's posters Time Limit: 1000MS Memory Limit: 65536K Description The citizens of By ...
- POJ 2528 Mayor's posters(线段树区间染色+离散化或倒序更新)
Mayor's posters Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 59239 Accepted: 17157 ...
- poj-----(2528)Mayor's posters(线段树区间更新及区间统计+离散化)
Mayor's posters Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 43507 Accepted: 12693 ...
- POJ 2528 Mayor's posters (线段树区间更新+离散化)
题目链接:http://poj.org/problem?id=2528 给你n块木板,每块木板有起始和终点,按顺序放置,问最终能看到几块木板. 很明显的线段树区间更新问题,每次放置木板就更新区间里的值 ...
- hihoCoder #1078 : 线段树的区间修改(线段树区间更新板子题)
#1078 : 线段树的区间修改 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 对于小Ho表现出的对线段树的理解,小Hi表示挺满意的,但是满意就够了么?于是小Hi将问题 ...
随机推荐
- java 发送微信客服消息
package com.baosight.wechat.service; import net.sf.json.JSONObject; import org.apache.commons.httpcl ...
- Solaris之单用户模式
1.TERM 表示终端 vt100 是简单的终端模式 export TERM=vt100 在此模式下,方向键无效,用字母键 有很多环境变量,PATH .PS1 .TERM 一般在屏幕上写的都是暂时的, ...
- 【每日Scrum】第七天(4.28)Sprint2总结性会议
本次会议主要是演示了一下本组项目的各项功能,每个人负责那一块儿功能由本人来负责说明和演示,确定alpha版本的发布时间,并且分派了各组员的文档负责情况,上图是会议记录,下面我详细介绍一下我组分派情况: ...
- MOS简单应用
高端功率开关驱动的原理非常简单,和低端功率开关驱动相对应,就是负载一端和开关管相连,另外一端直接接地.正常情况下,没有控制信号的时候,开关管不导通,负载中没有电流流过,即负载处于断电状态:反之,如果控 ...
- UDIMM、RDIMM、SODIMM以及LRDIMM的区别
DIMM简介 DIMM(Dual Inline Memory Module,双列直插内存模块)与SIMM(single in-line memory module,单边接触内存模组)相当类似,不同的只 ...
- 深度解析开发项目之 03 - enum的使用
深度解析开发项目之 03 - enum的使用 01 - 在#import和@interface之间定义typedef enum 注意: 默认是0,1,2,3 02 - 定义可以操作的数据类型的属性 0 ...
- NXP 公司的 RFID 卡
NXP 公司的 RFID 卡 NXP RFID MIFARE 产品概览   MIFARE 系列: Mifare Ultralight,简称 MF0. Mifare Classic,简称 MF1 M ...
- 采用ADM2582E/ADM2587E实现完全半/全双工的RS-485/RS-422接口隔离
RS-485标准是一种常见的总线架构,其通用性及远距离传输能力使其广泛应用于各种通信接口电路.在多数情况下,由于应用环境的恶劣,需要对RS-485接口采用隔离方案以防止出现接地环路. 对RS-485接 ...
- EasyDarwin开源流媒体服务器提供的RTMP直播推送库
EasyRTMP EasyRTMP是什么? EasyRTMP是一个EasyDarwin配套使用,也可以单独使用的RTMP推送库,通过EasyRTMP我们就可以避免接触到稍显复杂的RTMP推送流程,只需 ...
- HDOJ 4704 Sum 规律 欧拉定理
规律 欧拉定理: 找规律 2^n-1 ,n 非常大用欧拉定理 Sum Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/13 ...