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将问题 ...
随机推荐
- weblogic运维时经常遇到的问题和常用的配置
希望这篇能把weblogic运维时经常遇到的问题.常用的配置汇总到一起. 1.配置jvm参数: 一般在domain启动过程中会看到以下启动的日志信息,如下图所示: 图中红色方框部分为启动weblo ...
- favico是针对网页图标内容更改
favico.js源码 (function () { var Favico = function (opt) { "use strict"; opt = opt ? opt : { ...
- HDU 4514并查集判环+最长路
点击打开链接 题意:中文题...... 思路:先推断是否能成环,之前以为是有向图,就用了spfa推断,果断过不了自己出的例子,发现是无向图.并查集把,两个点有公共的父节点,那就是成环了,之后便是求最长 ...
- odoo高级物流应用:跨厂区生产
业务情景 半成品在分厂生产,然后再在总厂组装 半成品所需的原材料存储在分厂的仓库 总厂需要的原材料储存在总厂的仓库 公用的原材料储存在总厂的仓库 解决方案 使用仓库间的供应 设置合适的Rout ...
- windows平台是上的sublime编辑远程linux平台上的文件
sublime是个跨平台的强大的代码编辑工具,不多说. 想使用sublime完毕linux平台下django网站的代码编辑工作以提高效率(原来使用linux下的vim效率较低,适合编辑一些小脚本). ...
- JrtpLib vs2012环境下编译及使用 GotoFirstSourceWithData 方法 进不去
项目中有一项功能是接收rtp数据,接收rtp的可以用PJMedia,可以用JrtpLib.PJMedia库无法解决内外网的问题,只有用Jrtp库了. 首先说下Jrtp 的编译问题,我是在windows ...
- C# Select SelectMany 区别
string[] text = { "Today is 2018-06-06", "weather is sunny", "I am happy&qu ...
- Chrome 前端 插件
本文内容都来源于偶整理的fetool. 想让更多使用Chrome的小伙伴,体验到这些令人愉悦的小工具,所以单独整理了这篇文章. 如果你是 前端/服务端/设计/面向Github编程/视觉控,相信下列的插 ...
- 理解DOMSTRING、DOCUMENT、FORMDATA、BLOB、FILE、ARRAYBUFFER数据类型
一.XMLHttpRequest 2.0的家臣们 我大学那会儿,一个称为Ajax的东西对前端行业造成了深远影响,不仅是JS语言,而包括前端地位.职位兴起以及工作分工等.抛开IE6浏览器不谈,其他浏览器 ...
- Appium python自动化测试系列之认识Appium(四)
4.1界面认识 在之前安装appium的时候说过我们有两种方法安装,也就有两种结果,一种是有界面的,一种是没有界面的,首先我们先讲一下有界面的,以及界面有哪些东西. 首先看第一幅图,如果你的是win ...