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的更多相关文章

  1. memory-based 协同过滤(CF)方法

    协同过滤(collaborative filtering,CF)算法主要分为memory-based CF 和 model-based CF,而memory-based CF 包括user-based ...

  2. Hello2020(前四题题解)

    Hello,2020!新的一年从快乐的掉分开始…… 我在m3.codeforces.com这个镜像网站中一开始还打不开D题,我…… 还有话说今天这场为什么那么多二分. 比赛传送门:https://co ...

  3. ENode框架Conference案例分析系列之 - 文章索引

    ENode框架Conference案例分析系列之 - 业务简介 ENode框架Conference案例分析系列之 - 上下文划分和领域建模 ENode框架Conference案例分析系列之 - 架构设 ...

  4. 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 ...

  5. International Conference for Smart Health 2015 Call for Papers

    Advancing Informatics for healthcare and healthcare applications has become an international researc ...

  6. 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 ...

  7. 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 ...

  8. ENode框架Conference案例分析系列之 - 业务简介

    前言 ENode是一个应用开发框架.通过ENode,我们可以方便的开发基于DDD+CQRS+EventSourcing+EDA架构的应用程序.之前我已经写了很多关于ENode的架构以及设计原理的文章, ...

  9. ENode框架Conference案例分析系列之 - 上下文划分和领域建模

    前面一片文章,我介绍了Conference案例的核心业务,为了方便后面的分析,我这里再列一下: 业务描述 Conference是这样一个系统,它提供了一个在线创建会议以及预订会议座位的平台.这个系统的 ...

随机推荐

  1. Kubernetes K8S之CPU和内存资源限制详解

    Kubernetes K8S之CPU和内存资源限制详解 Pod资源限制 备注:CPU单位换算:100m CPU,100 milliCPU 和 0.1 CPU 都相同:精度不能超过 1m.1000m C ...

  2. C#处理医学图像(一):基于Hessian矩阵的血管肺纹理骨骼增强对比

    在医院实际环境中,经常遇到有问题的患者,对于一些特殊的场景,比如骨折,肺结节,心脑血管问题 需要图像对比增强来更为清晰的显示病灶助于医生确诊,先看效果: 肺纹理增强: 肺结节增强: 血管对比增强: 骨 ...

  3. MQ for linux安装与卸载【转】

    MQ for linux安装与卸载[转] 一.安装步骤:1. 用root帐号登录系统2. MQ安装程序需将代码安装到目录/opt/mqm下,将数据保存到目录/var/mqm下,需确保相关目录下有足够的 ...

  4. maven 的安装与配置详细步骤

    1. 直接搜索maven 2. 进入后点击download界面,这时出现的是当前最新版本, 当然还有以前的版本可供下载 3. 下载解压到你指定的目录后,需要配置一下环境变量. a. 右键此电脑点击属性 ...

  5. SpringBoot嵌入式Servlet容器

    SpringBoot默认是将Tomcat作为嵌入式的servlet容器. 问题: 如何修改嵌入式的servlet容器? 1)在配置文件中设置对应的属性值 server.port=8081 # Tomc ...

  6. 在JavaScript种遇到这样的错误如何解决XML 解析错误:格式不佳 位置:http:/... 行 27,列 32:

    相信很多人在开发的过程中都会遇到在js中解析xml文档的问题.有时候文档解析失败,但就是不知道怎么失败的,哪里格式不对.这里教大家一个方法来排查JavaScript解析xml文档格式出错的办法. 1. ...

  7. 为啥使用innodb_flush_method=o_direct 就能减轻io压力呢

    为啥使用innodb_flush_method=o_direct 就能减轻io压力呢

  8. ctfhub技能树—密码口令—弱口令

    什么是弱口令? "弱口令(weak password) 没有严格和准确的定义,通常认为容易被别人(他们有可能对你很了解)猜测到或被破解工具破解的口令均为弱口令. 弱口令指的是仅包含简单数字和 ...

  9. pandas DataFrame的新增行列,修改、删除、筛选、判断元素以及转置操作

    1)指定行索引和列索引标签 index 属性可以指定 DataFrame 结构中的索引数组,  columns 属性可以指定包含列名称的行, 而使用 name 属性,通过对一个 DataFrame 实 ...

  10. 学习Java第三天

    方法重载:同一个类,方法名相同,参数不同(个数不同,类型不同,顺序不同),判断是否重载,只看方法名和参数,跟返回值无关. IDEA查看方法源代码:Crtl + 鼠标左键 进制表示 Java数值默认为十 ...