CF Hello2020 D. New Year and Conference
D. New Year and Conference
题意
有\(2n\)个区间,分别为\([sa_1,ea_1],[sb_1,eb_1],[sa_2,ea_2],[sb_2,eb_2],\cdots,[sa_n,ea_n],[sb_n,eb_n]\),每两个区间为一对,共\(n\)对区间。一对中的两个区间绑定在一起,从n对中选出一个子集。存在一种情况是:子集中某个系列(a或b)区间有区间交,而另外一个系列的区间没有区间交。如果这个情况发生在某个子集中,则输出NO,否则输出YES
分析
先考虑a系列区间交的所有可能,枚举交点,将包含该交点的所有a区间都放到数轴上,同时把对应的b区间也放在数轴上,那么这些b区间中两两之间也必须在某点交。
做法是按照a系列区间的左右端点,存放区间编号于vector中,从左到右扫交点,同时将b区间加到线段树上,并同时判断当前加的b区间是否与之前的b区间都交,不是的话输出NO。
const int inf = 0x3f3f3f3f;
const int N = 400010;
int n;
struct SegTree{
int l,r;
int mx,lazy;
}t[N*4];
struct node{
int l,r,id;
}a[N],b[N];
vector<int> l[N],r[N],alls;
void build(int p,int l,int r){
t[p].l = l;t[p].r = r;
if(l == r){
t[p].mx = t[p].lazy = 0;
return;
}
int mid = l + r >> 1;
build(p*2,l,mid);
build(p*2+1,mid+1,r);
t[p].mx = t[p].lazy = 0;
}
void pushdown(int p){
if(t[p].lazy){
t[p*2].mx += t[p].lazy;
t[p*2+1].mx += t[p].lazy;
t[p*2].lazy += t[p].lazy;
t[p*2 + 1].lazy += t[p].lazy;
t[p].lazy = 0;
}
}
int ask(int p,int l,int r){
if(t[p].l >= l && t[p].r <= r){
return t[p].mx;
}
pushdown(p);
int mid = t[p].l + t[p].r >> 1;
int res = 0;
if(mid >= l)res = max(res,ask(p*2,l,r));
if(mid < r)res = max(res,ask(p*2+1,l,r));
return res;
}
void add(int p,int l,int r,int val){
if(t[p].l >= l && t[p].r <= r){
t[p].mx += val;
t[p].lazy += val;
return;
}
pushdown(p);
int mid = t[p].l + t[p].r >> 1;
if(mid >= l)add(p*2,l,r,val);
if(mid < r)add(p*2+1,l,r,val);
t[p].mx = max(t[p*2].mx,t[p*2+1].mx);
}
bool check(node *a,node *b){
int len = alls.size();
build(1,1,len);
for(int i=1;i<=len;i++){
l[i].clear();
r[i].clear();
}
for(int i=1;i<=n;i++){
l[a[i].l].push_back(i);
r[a[i].r].push_back(i);
}
int sz = 0;
for(int i=1;i<=len;i++){
for(int j=0;j<l[i].size();j++){
int id = l[i][j];
//把id铺上
int L = b[id].l, R = b[id].r;
//[L,R] 之间最大值必须为sz
int res = ask(1,L,R);
if(res != sz) return false;
add(1,L,R,1);
sz++;
}
for(int j=0;j<r[i].size();j++){
int id = r[i][j];
int L = b[id].l, R= b[id].r;
add(1,L,R,-1);
sz--;
}
}
return true;
}
int getId(int x){
return lower_bound(alls.begin(),alls.end(),x) - alls.begin() + 1;
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d%d%d%d",&a[i].l,&a[i].r,&b[i].l,&b[i].r);
alls.push_back(a[i].l);
alls.push_back(a[i].r);
alls.push_back(b[i].l);
alls.push_back(b[i].r);
a[i].id = i;
b[i].id = i;
}
sort(alls.begin(),alls.end());
alls.erase(unique(alls.begin(),alls.end()),alls.end());
for(int i=1;i<=n;i++){
a[i].l = getId(a[i].l);
a[i].r = getId(a[i].r);
b[i].l = getId(b[i].l);
b[i].r = getId(b[i].r);
}
int c1 = check(a,b);
int c2 = check(b,a);
if(c1 && c2){
puts("YES");
}else puts("NO");
return 0;
}
CF Hello2020 D. New Year and Conference的更多相关文章
- memory-based 协同过滤(CF)方法
协同过滤(collaborative filtering,CF)算法主要分为memory-based CF 和 model-based CF,而memory-based CF 包括user-based ...
- Hello2020(前四题题解)
Hello,2020!新的一年从快乐的掉分开始…… 我在m3.codeforces.com这个镜像网站中一开始还打不开D题,我…… 还有话说今天这场为什么那么多二分. 比赛传送门:https://co ...
- ENode框架Conference案例分析系列之 - 文章索引
ENode框架Conference案例分析系列之 - 业务简介 ENode框架Conference案例分析系列之 - 上下文划分和领域建模 ENode框架Conference案例分析系列之 - 架构设 ...
- ORA-00494: enqueue [CF] held for too long (more than 900 seconds) by 'inst 1, osid 5166'
凌晨收到同事电话,反馈应用程序访问Oracle数据库时报错,当时现场现象确认: 1. 应用程序访问不了数据库,使用SQL Developer测试发现访问不了数据库.报ORA-12570 TNS:pac ...
- International Conference for Smart Health 2015 Call for Papers
Advancing Informatics for healthcare and healthcare applications has become an international researc ...
- Call for Papers IEEE/ACM International Conference on Advances in Social Network Analysis and Mining (ASONAM)
IEEE/ACM International Conference on Advances in Social Network Analysis and Mining (ASONAM) 2014 In ...
- Call for Papers International Conference for Smart Health (ICSH) 2014
Call for PapersInternational Conference for Smart Health (ICSH) 2014 Beijing, China July 10-11, 2014 ...
- ENode框架Conference案例分析系列之 - 业务简介
前言 ENode是一个应用开发框架.通过ENode,我们可以方便的开发基于DDD+CQRS+EventSourcing+EDA架构的应用程序.之前我已经写了很多关于ENode的架构以及设计原理的文章, ...
- ENode框架Conference案例分析系列之 - 上下文划分和领域建模
前面一片文章,我介绍了Conference案例的核心业务,为了方便后面的分析,我这里再列一下: 业务描述 Conference是这样一个系统,它提供了一个在线创建会议以及预订会议座位的平台.这个系统的 ...
随机推荐
- 腾讯IOT之树莓派物联网设备
目录 腾讯IOT之树莓派物联网设备 硬件配置 软件配置 Tecent IOT 开发平台的使用 新建项目 新建产品 添加自定义功能 设备开发 微信小程序配置 面板配置 新建设备 使用设备 在线调试 设备 ...
- 打算写一些Netty的文章了,先聊聊为什么要学习Netty
微信搜索[阿丸笔记],关注Java/MySQL/中间件各系列原创实战笔记,干货满满. 2021年了,终于开始系统性总结Netty相关的东西了. 这会是Netty系列的第一篇,我想先聊聊 "为 ...
- Java通过基姆拉尔森公式判断当前日期是不是工作日
基姆拉尔森公式 算法如下: 基姆拉尔森计算公式 W= (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400+1)%7 在公式中d表示日期中的日数,m表示月份数,y表示年数. 注意:在公 ...
- CopyOnWriteArrayList设计思路与源码分析
CopyOnWriteArrayList实现了List接口,RandomAccess,Cloneable,Serializable接口. CopyOnWriteArrayList特性 1.线程安全,在 ...
- 【RAC】安装rac的时候。报错checking for oracle home incompatibilities failed
背景:由于oracle安装的时候中途出现了问题,解决过后,发现报错了 图形化安装的时候,有这个问题出现 解决办法: 删除安装过的所有缓存,和文件即可 1.删除ORACLE_BASE下的所有文件 2.删 ...
- oracle分区表分区栏位NULL值测试
实验在分区栏位为NULL时,分区表的反应 1.创建普通的分区表 CREATE TABLE MONKEY.TEST_PART_NULL_NORMAL ( ID NUMBER, ADD_DATE DATE ...
- css全站变灰
2020年4月4日全国哀悼日这一天,我发现不少网址都变灰了,我第一想法就是怎么做到的?不可能换素材整个网址重做一遍吧?后面发现是用的其实是css的filter滤镜: grayscale可以将图像转化为 ...
- HTML5表格详细教程
HTML5表格 文章目录 HTML5表格 5.1 定义表格 5.1.1 普通表格.列标题 5.1.2 表格标题 5.1.3 表格行分组.表格列分组 5.2 表格属性 5.2.1 单线表格.分离单元格 ...
- Java集合List-差集、并集、交集
Java集合List的差集.并集.交集 转载于:https://www.cnblogs.com/qlqwjy/p/9812919.html 一.List的差集 @Test public void te ...
- linux登陆欢迎信息及命令提示符修改
登录信息修改 登陆信息显示数据 : /etc/issue and /etc/motd 登陆终端机的时候,会有几行提示的字符串,这些设置在/etc/issue里面可以修改,提示内容在/etc/motd中 ...