codeforces 1284D. New Year and Conference(线段树)
题意:有n场讲座,有两个场地a和b,如果在a场地开讲座则需要占用[sai,eai],在b场地开讲座则需要占用[sbi,ebi]这个时间段,假如开两场讲座,如果在a场地开不冲突,而b场地开冲突,则称其为敏感的,同理a和b反过来也是一样的,如果ab两场地都冲突则也不是敏感的,先求给定的n场讲座,任意的两两开设是否敏感。
思路:暴力枚举是O(n^2)复杂度,必定超时,这里可以用线段树或ST表做,达到一个nlogn的复杂度。对于任意一个讲座x,找出所有与x讲座在a场地冲突的讲座,再判断其是否在b场地冲突,如果不是则直接输出“NO”
首先对所有讲座的sa和ea进行升序,例如讲座 i 的时间片是[x,y],在其时间片上与 i 在a场地冲突的讲座用二分的方法可以枚举出来一个离散化后的区间,然后我们用线段树维护b场地的sb最大值和eb最小值,每次查询出这个区间的
的sb最大值和eb最小值,此时如果说sb最大值 > y 或者 eb最小值 < x,那么这些表演中必定存在b场地与表演i不冲突的情况,此时直接输出“NO”,把所有的讲座都check一遍,交换ab次序再check即可,上述只检验了在a场地冲突一定在b场地冲突的情况,但并未考虑在b场地冲突而在a场地不冲突的情况。
总体时间复杂度nlogn。
AC代码:
#include<iostream>
#include<vector>
#include<cstdlib>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<queue>
#include<map>
using namespace std;
typedef long long ll;
const int maxn = 1e5+;
struct node{
int sa,ea,sb,eb;
node(){};
node(int a,int b,int c,int d){
sa = a,ea = b,sb = c,eb = d;
}
bool operator<(node cur)const{
if(sa == cur.sa ) return ea<cur.ea ;
return sa < cur.sa ;
}
}point[maxn];
int segt_max[*maxn],segt_min[*maxn];
void build(int l,int r,int k){//建两个线段树维护区间最大最小值
if(l == r) {
segt_max[k] = point[l].sb;
segt_min[k] = point[l].eb;
return ;
}
int mid = (l+r)/;
build(l,mid,*k);
build(mid+,r,*k+);
segt_max[k] = max(segt_max[*k],segt_max[*k+]);
segt_min[k] = min(segt_min[*k],segt_min[*k+]);
}
int queryMin(int l,int r,int al,int ar,int k){//查询区间最小值
if(l >= al && r <= ar) return segt_min[k];
int mid = (l+r)/;
if(ar<=mid) return queryMin(l,mid,al,ar,*k);
else if(al>mid){
return queryMin(mid+,r,al,ar,*k+);
}
else {
return min(queryMin(l,mid,al,mid,*k),queryMin(mid+,r,mid+,ar,*k+));
}
}
int queryMax(int l,int r,int al,int ar,int k){//查询区间最大值
if(l >= al && r <= ar) return segt_max[k];
int mid = (l+r)/;
if(ar<=mid) return queryMax(l,mid,al,ar,*k);
else if(al>mid){
return queryMax(mid+,r,al,ar,*k+);
}
else {
return max(queryMax(l,mid,al,mid,*k),queryMax(mid+,r,mid+,ar,*k+));
}
}
bool check(int n){
sort(point+,point++n);
build(,n,);
for(int i = ;i<=n;i++){
int pos = lower_bound(point+,point++n,node(point[i].ea ,1e9+,,))-point-;
//查找与第i场演讲冲突的集合
if(i+>pos) continue;//无冲突直接跳过
//check一下另一个场地的所有表演是否都冲突
if(queryMin(,n,i+,pos,)<point[i].sb || queryMax(,n,i+,pos,)>point[i].eb){
return false;
}
}
return true;
}
int main()
{
int n;
cin>>n;
int f = ;
for(int i = ;i<=n;i++){
cin>>point[i].sa>>point[i].ea>>point[i].sb>>point[i].eb;
}
if(check(n)) f++;
for(int i = ;i<=n;i++){
swap(point[i].sa,point[i].sb);
swap(point[i].ea,point[i].eb);
}
if(check(n)) f++;
if(f == ) cout<<"YES";
else cout<<"NO";
return ;
}
codeforces 1284D. New Year and Conference(线段树)的更多相关文章
- [Codeforces 266E]More Queries to Array...(线段树+二项式定理)
[Codeforces 266E]More Queries to Array...(线段树+二项式定理) 题面 维护一个长度为\(n\)的序列\(a\),\(m\)个操作 区间赋值为\(x\) 查询\ ...
- [Codeforces 280D]k-Maximum Subsequence Sum(线段树)
[Codeforces 280D]k-Maximum Subsequence Sum(线段树) 题面 给出一个序列,序列里面的数有正有负,有两种操作 1.单点修改 2.区间查询,在区间中选出至多k个不 ...
- codeforces 1217E E. Sum Queries? (线段树
codeforces 1217E E. Sum Queries? (线段树 传送门:https://codeforces.com/contest/1217/problem/E 题意: n个数,m次询问 ...
- Codeforces 444 C. DZY Loves Colors (线段树+剪枝)
题目链接:http://codeforces.com/contest/444/problem/C 给定一个长度为n的序列,初始时ai=i,vali=0(1≤i≤n).有两种操作: 将区间[L,R]的值 ...
- Codeforces Gym 100513F F. Ilya Muromets 线段树
F. Ilya Muromets Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100513/probl ...
- Codeforces 834D The Bakery【dp+线段树维护+lazy】
D. The Bakery time limit per test:2.5 seconds memory limit per test:256 megabytes input:standard inp ...
- codeforces 1017C - Cloud Computing 权值线段树 差分 贪心
https://codeforces.com/problemset/problem/1070/C 题意: 有很多活动,每个活动可以在天数为$[l,r]$时,提供$C$个价格为$P$的商品 现在从第一天 ...
- Codeforces 1045. A. Last chance(网络流 + 线段树优化建边)
题意 给你 \(n\) 个武器,\(m\) 个敌人,问你最多消灭多少个敌人,并输出方案. 总共有三种武器. SQL 火箭 - 能消灭给你集合中的一个敌人 \(\sum |S| \le 100000\) ...
- Codeforces 446C DZY Loves Fibonacci Numbers [线段树,数论]
洛谷 Codeforces 思路 这题知道结论就是水题,不知道就是神仙题-- 斐波那契数有这样一个性质:\(f_{n+m}=f_{n+1}f_m+f_{n}f_{m-1}\). 至于怎么证明嘛-- 即 ...
随机推荐
- JAVA成长之路SpringCloud脚印(一)
从即日起开始学习SpringCloud,在这里记录下学习过程,共勉,欢迎指正. 环境:IDEA2019.3.3.JAVA13 一.spring cloud简介 spring cloud 为开发人员提供 ...
- Windows终端操作命令结合
虽然随着计算机产业的发展,Windows 操作系统的应用越来越广泛,DOS 面临着被淘汰的命运,但是因为它运行安全.稳定,有的用户还在使用,所以一般Windows 的各种版本都与其兼容,用户可以在Wi ...
- 给你的HTTPS添加Let's Encrypt证书
Let’s Encrypt setup for Apache, NGINX & Node.js https://gist.github.com/davestevens/c9e437afbb41 ...
- 在VS的依赖项中引用项目
操作步骤:鼠标右击项目(注意是项目)->添加->引用->项目(在项目列表中选择需要引用的项目)->确定
- IDEA自定义TODO
配置自己的TODO标签 , 避免跟其他人产生错乱 打开TODO页签 , 有三种方式打开 菜单栏打开 View -> Tool Windows -> TODO 快捷键打开 Alt + 6 快 ...
- Python第三方库requests的编码问题
PS:这个解决方法可能很简单,但是这是平时的一些细节问题,所以有必要提醒一下! 首先代码不多,就是通过get方法去获取豆瓣首页信息,如图:但是会报UnicodeEncodeError: 'gbk' c ...
- qt creator源码全方面分析(1)
目录介绍 首先我们对软件源代码根目录下的各个重要文件(夹)做一个简单的介绍,对整体有一个大概的了解. 下面对目录及其内容做一个大概的初步的介绍,后面我尽量按照目录顺序进行依次介绍,当然可能会有一些交叉 ...
- beego控制器介绍
控制器介绍 提示:在 v1.6 中,此文档所涉及的 API 有重大变更,this.ServeJson() 更改为 this.ServeJSON(),this.TplNames 更改为 this.Tpl ...
- 阿里云IIS服务器SSL证书安装
一.前提条件 申请证书时需要选择 系统自动创建CSR. 申请证书时如果选择手动创建CSR,则不会生成证书文件.您需要选择其他服务器下载.crt证书文件后,使用openssl命令将.crt文件的证书转换 ...
- 中文 json_encode之后字符长度问题
问题描述: 将某个字符串$str 进行json编码,即json_encode($str)后变成Unicode字符存入数据库,会发现中文的长度明明没有超过设置的字符长度最大值,但是却抛出字段长度过长错误 ...