时间限制:20000ms
单点时限:2000ms
内存限制:256MB

描述

小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 : 紧张的会议室(区间最大+离散化)的更多相关文章

  1. hiho 1590 - 紧张的会议室。区间问题

    题目链接 小Hi的公司最近员工增长迅速,同时大大小小的会议也越来越多:导致公司内的M间会议室非常紧张. 现在小Hi知道公司目前有N个会议,其中第i个会议的时间区间是(Si, Ei). 注意这里时间区间 ...

  2. POJ-2528 Mayor's posters (线段树区间更新+离散化)

    题目分析:线段树区间更新+离散化 代码如下: # include<iostream> # include<cstdio> # include<queue> # in ...

  3. POJ 2528 Mayor's posters (线段树+区间覆盖+离散化)

    题意: 一共有n张海报, 按次序贴在墙上, 后贴的海报可以覆盖先贴的海报, 问一共有多少种海报出现过. 题解: 因为长度最大可以达到1e7, 但是最多只有2e4的区间个数,并且最后只是统计能看见的不同 ...

  4. hiho一下21周 线段树的区间修改 离散化

    离散化 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho在回国之后,重新过起了朝7晚5的学生生活,当然了,他们还是在一直学习着各种算法~ 这天小Hi和小Ho ...

  5. POJ 2528 Mayor's posters(线段树/区间更新 离散化)

    题目链接: 传送门 Mayor's posters Time Limit: 1000MS     Memory Limit: 65536K Description The citizens of By ...

  6. POJ 2528 Mayor's posters(线段树区间染色+离散化或倒序更新)

    Mayor's posters Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 59239   Accepted: 17157 ...

  7. poj-----(2528)Mayor's posters(线段树区间更新及区间统计+离散化)

    Mayor's posters Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 43507   Accepted: 12693 ...

  8. POJ 2528 Mayor's posters (线段树区间更新+离散化)

    题目链接:http://poj.org/problem?id=2528 给你n块木板,每块木板有起始和终点,按顺序放置,问最终能看到几块木板. 很明显的线段树区间更新问题,每次放置木板就更新区间里的值 ...

  9. hihoCoder #1078 : 线段树的区间修改(线段树区间更新板子题)

    #1078 : 线段树的区间修改 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 对于小Ho表现出的对线段树的理解,小Hi表示挺满意的,但是满意就够了么?于是小Hi将问题 ...

随机推荐

  1. STL源代码剖析 容器 stl_deque.h

    本文为senlie原创.转载请保留此地址:http://blog.csdn.net/zhengsenlie deque ---------------------------------------- ...

  2. Git安装及SSH Key管理之Mac篇

    1.下载git客户端,下载地址为:https://git-scm.com/download/mac 2.打开安装包,可以看到此时的界面为:   我们需要把.pkg的安装包安装到系统当中.我双击了安装包 ...

  3. PS 如何制作WIN7的玻璃化透明窗口效果

    1 绘制一个圆角矩形,并将不透明度设为16%以及添加投影效果   2 再次添加外发光效果   3 新建一个图层,再填充一下这个圆角矩形(可以填充为任意颜色,只要和别的颜色区分开来)   4 选中这个区 ...

  4. 没有IP地址的主机怎样保持IP层联通

    在<两台不同网段的PC直连能否够相互ping通>一文中,我有点像在玩旁门左道,本文中.我继续走火入魔.两台机器,M1和M2,各自有一个网卡eth0,配置例如以下:M1的配置:eth0上不配 ...

  5. Odoo calendar 提醒器

    Odoo calendar 提供了一个提醒功能,它包含邮件通知以及web client弹窗功能     创建日历事件的时候,可以设置提醒器     Meeting [ calendar.event ] ...

  6. Solaris 目录与文件管理

    熟悉系统目录结构 掌握27个常用命令 掌握针对目录.文件的操作 掌握查找与文件内容的操作 一.命令 命令:内部命令(不依赖其他文件,可以直接执行)与外部命令 .他是用于实现某一类功能的指令或程序,其执 ...

  7. Unix系统介绍

    一.基础知识 操作系统 用户与计算机硬件之间的界面,是控制.管理计算机内各种硬件与软件资源.它是一个多用户.多任务.分时的操作系统. 对于分时系统:假如a进程需要16个时间片,现在根据优先级只分配了1 ...

  8. c#打包文件解压缩 C#中使用委托、接口、匿名方法、泛型委托实现加减乘除算法 一个简单例子理解C#的协变和逆变 对于过长字符串的大小比对

    首先要引用一下类库:using Ionic.Zip;这个类库可以到网上下载. 下面对类库使用的封装方法: 得到指定的输入流的ZIP压缩流对象 /// <summary> /// 得到指定的 ...

  9. ARP协议(1)什么是ARP协议

    这是最近在看<TCP/IP具体解释>系列书总结出来的,之后会陆续把其它协议部分分享出来. 我尽量以简单易读.易懂的方式呈现出来,可是,因为文笔和水平有限.有些地方或许存在描写叙述上的不足或 ...

  10. MVC入门——详细页

    添加Action ShowDetail using System; using System.Collections.Generic; using System.Linq; using System. ...