时间限制: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. python matplotlib包图像配色方案

    可选的配色方案: Accent, Accent_r, Blues, Blues_r, BrBG, BrBG_r, BuGn, BuGn_r, BuPu, BuPu_r, CMRmap, CMRmap_ ...

  2. JMeter 压力測试使用函数和 CSV 文件參数化 json 数据

            在 http Load Testing 中.json 数据的提交是个让人头疼的问题.本文具体介绍怎样进行 JMeter 的 json 測试提交,以及怎样将其參数化.        St ...

  3. Cookie学习笔记二:Cookie实例

    今天说说刚刚学到的两个Cookie的最经典应用:自己主动登录和购物车设置 一:自己主动登录 须要两个页面:login.jsp与index.jsp,login.jsp用来输出登录信息,index.jsp ...

  4. MySQL命令学习(一)

    今天我们来学习一下MySQL中的经常使用命令(MySQL中的命令keyword是不区分大写和小写的): (1)show databases; 显示MySQL中的全部database (2)create ...

  5. 杭电 HDU 1279 验证角谷猜想

    验证角谷猜想 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Sub ...

  6. C99_变长结构体实现

    /************************************************************************* > File Name: C99_lengt ...

  7. UVA 10042 Smith Numbers(数论)

    Smith Numbers Background While skimming his phone directory in 1982, Albert Wilansky, a mathematicia ...

  8. 算法NB三人组

    #快速排序-除了python自带的sort排序模块之外就这个最好用,只需会这个就行,其他的排序了解就好,能用冒泡,插入..的都可以用快排快速实现 import random from timewrap ...

  9. 【LeetCode with Python】 Sort List

    博客域名:http://www.xnerv.wang 原题页面:https://oj.leetcode.com/problems/sort-list/ 题目类型: 难度评价:★ 本文地址:http:/ ...

  10. GreenPlum 安装方法详解

    一.安装环境准备 1.磁盘环境准备 磁盘分区典型配置如下: 文件系统 文件格式    大小  /        ext3   50GB,Linux系统的根目录,所有的目录都挂在这个目录下面,建议大小为 ...