时间限制: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. [反汇编练习] 160个CrackMe之036

    [反汇编练习] 160个CrackMe之036. 本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注 ...

  2. utuntu16.04安装tensorflow1.4-gpu

    之前一直在windows下使用tensorflow,对cpu和gpu的安装都是比较顺利,都是使用anaconda环境下,创建虚拟conda环境,这样方便不同python版本的管理. 一直也想尝试使用u ...

  3. Neutron网络入门

    Neutron是OpenStack核心项目之中的一个,提供云计算环境下的虚拟网络功能.Neutron的功能日益强大,并在Horizon面板中已经集成该模块.作为Neutron的核心开发人员之中的一个. ...

  4. 【Unity3D自学记录】Unity3D之自制小钟表

    今天来写一个小钟表,事实上非常easy,就运用到了欧拉角. 首先创建时钟.分钟.秒钟以及4个点(12点.3点.6点.9点)偷懒了~~没弄那么多点. 时钟.分钟.秒钟这三个父级的中心一定要注意,我们旋转 ...

  5. react request.js 函数封装

    1.request.js  函数封装 import { Toast } from 'antd-mobile'; import axios from 'axios'; import store from ...

  6. vue2.0 自定义 提示框(Toast)组件

    1.自定义 提示框 组件 src / components / Toast / index.js /** * 自定义 提示框( Toast )组件 */ var Toast = {}; var sho ...

  7. Hadoop 50090端口的页面, Replication的数字是真实的文件备份数吗? (不是)

    红色方框的部分,代表Hadoop系统,人工设定的文件备份数,但不是实际的备份数.文件备份数 不会大于集群机器的总数目(因为备份文件不会同时存在一台机器上,这样就没有意义),所以如果总集群数目是2,即使 ...

  8. JavaScript包管理器综述

    JavaScript包管理器综述 作者:chszs,未经博主同意不得转载.经许可的转载需注明作者和博客主页:http://blog.csdn.net/chszs 对于JavaScript来说.包管理器 ...

  9. vs2010音频文件压缩 调用lame_enc.dll将WAV格式转换成MP3

    /* //My_lame.h */ #pragma once#include "stdafx.h"#include <windows.h>#include <st ...

  10. Ubuntu16.04下自定义命令

    每次启动pycharm的时候需要敲一段很长的文本,真的是感觉好麻烦啊,如果能直接敲命令启动就好了,既装B又实用的 那么到底应该怎么做呢?其实挺简单的 在文件/root/.bashrc 中添加下边的几行 ...