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. Kafka 探险 - 架构简介

    Kafka 探险 - 架构简介 这个 Kafka 的专题,我会从系统整体架构,设计到代码落地.和大家一起杠源码,学技巧,涨知识.希望大家持续关注一起见证成长! 我相信:技术的道路,十年如一日!十年磨一 ...

  2. maven打包时排除配置文件

    上网查了一下,直接在pom里面配置就好了,具体写法如下所示 <build> ... <resources> <resource> <directory> ...

  3. vue-vite浅析

    大家好,我是小雨小雨,致力于分享有趣的.实用的文章. 内容分为原创和翻译,如果有问题,欢迎随时评论或私信,很乐意和大家一起探讨,一起进步. 分享不易,希望能够得到大家的支持和关注. vite出了好久了 ...

  4. 【JDBC核心】DAO 相关

    DAO 相关 概念 DAO:Data Access Object 访问数据信息的类和接口,包括了对数据的 CRUD(Create.Retrival.Update.Delete),而不包含任何业务相关的 ...

  5. LeetCode235 二叉搜索树的最近公共祖先

    给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先. 百度百科中最近公共祖先的定义为:"对于有根树 T 的两个结点 p.q,最近公共祖先表示为一个结点 x,满足 x 是 p.q 的祖 ...

  6. 【Flutter】功能型组件之异步UI更新

    前言 很多时候会依赖一些异步数据来动态更新UI,比如在打开一个页面时我们需要先从互联网上获取数据,在获取数据的过程中我们显示一个加载框,等获取到数据时我们再渲染页面:又比如想展示Stream(比如文件 ...

  7. SpringBoot同时接收单个对象和List<object>参数

    最近做项目的有个需求,是把多个文件移动到另一个文件夹下,这需要把 新的文件夹id -- Long类型 多个文件的信息 -- List< Object > 类型 这两个参数传给后台,我的后台 ...

  8. zookeeper读取事务日志、快照日志

    zookeeper的事务日志的格式如 log.xxx, xxx表示顺序序号 我使用的zookeeper版本:3.5.5 事务日志 执行命令 java -cp .:/tmp/zookeeper-3.5. ...

  9. 【Oracle】删除(释放)数据文件/表空间流程

    oracle删除(释放)数据文件/表空间流程 生产环境:数据库里空间不足,niptest 表空间251G,只使用了17G 再alter database datafile '...../niptest ...

  10. win10打开IIS服务并发布网站

    1.打开控制面板 win+x后点击控制面板 2.点击程序集下边的解除安装程式 3.点击开启或关闭windows功能 4.找到Internet information services并勾选前面的复选框 ...