题:https://codeforces.com/contest/1284/problem/D

题意:给定n个1对的时间断,我是这么理解的,甲去参加a时间段的讲座,乙去参加b时间段的讲座,然后若这n对中若能挑出这样一个子集段:甲能参加第 i 个时间段的讲座而乙不能。就输出“NO”(注意,甲乙参加讲座的时间段是给定的a时间段,和b时间段,并不是同一个时间段)

分析:枚举a时间段的时间交,然后讲对应的b时间段的时间交加到线段数上,俩者的时间交数一定要相同,因为这些b区间中两两之间也必须在某点交。

   可以理解为“要么都可以去,要么都不可以去”。

#include<bits/stdc++.h>
using namespace std;
const int M=4e5+;
typedef long long ll;
#define pb push_back
#define lson root<<1,l,midd
#define rson root<<1|1,midd+1,r
struct tree{
int val,lazy;
}tr[M<<];
vector<int>l[M],r[M],lisan;
struct node{
int l,r,id;
}a[M],b[M];
int n;
void build(int root,int l,int r){
if(l==r){
tr[root].val=tr[root].lazy=;
return ;
}
int midd=(l+r)>>;
build(lson);
build(rson);
tr[root].val=tr[root].lazy=;
}
void pushdown(int root){
int x=tr[root].lazy;
tr[root<<].val+=x;
tr[root<<|].val+=x;
tr[root<<].lazy+=x;
tr[root<<|].lazy+=x;
tr[root].lazy=;
}
void up(int root){
tr[root].val=max(tr[root<<].val,tr[root<<|].val);
}
void update(int L,int R,int val,int root,int l,int r){
if(L<=l&&r<=R){
tr[root].val+=val;
tr[root].lazy+=val;
return ;
}
if(tr[root].lazy!=)
pushdown(root);
int midd=(l+r)>>;
if(L<=midd)
update(L,R,val,lson);
if(R>midd)
update(L,R,val,rson);
up(root);
}
int query(int L,int R,int root,int l,int r){
if(L<=l&&r<=R)
return tr[root].val;
if(tr[root].lazy!=)
pushdown(root);
int maxx=,midd=(l+r)>>;
if(L<=midd)
maxx=max(maxx,query(L,R,lson));
if(R>midd)
maxx=max(maxx,query(L,R,rson));
up(root);
return maxx;
}
bool solve(node *a,node *b){
int len=lisan.size();
build(,,len);
for(int i=;i<=len;i++)
l[i].clear(),r[i].clear();
for(int i=;i<=n;i++){
l[a[i].l].pb(i);
r[a[i].r].pb(i);
}
int countt=;
for(int i=;i<=len;i++){
for(int j=;j<l[i].size();j++){
int id=l[i][j];
int L=b[id].l,R=b[id].r;
///把所有b加上,数量要和与b匹配的a在这个区间上相交的数目countt相同
int mx=query(L,R,,,len);
if(mx!=countt)
return false;
update(L,R,,,,len);
countt++;
}
///和上面部分合起来是处理区间交的过程
for(int j=;j<r[i].size();j++){
int id=r[i][j];
int L=b[id].l,R=b[id].r;
update(L,R,-,,,len);
countt--;
}
}
return true;
}
int main(){
scanf("%d",&n);
for(int x1,x2,y1,y2,i=;i<=n;i++){
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
lisan.pb(x1),lisan.pb(y1),lisan.pb(x2),lisan.pb(y2);
a[i].l=x1,a[i].r=y1,a[i].id=i;
b[i].l=x2,b[i].r=y2,b[i].id=i;
}
sort(lisan.begin(),lisan.end());
lisan.erase(unique(lisan.begin(),lisan.end()),lisan.end());
for(int i=;i<=n;i++){
a[i].l=lower_bound(lisan.begin(),lisan.end(),a[i].l)-lisan.begin()+;
a[i].r=lower_bound(lisan.begin(),lisan.end(),a[i].r)-lisan.begin()+;
b[i].l=lower_bound(lisan.begin(),lisan.end(),b[i].l)-lisan.begin()+;
b[i].r=lower_bound(lisan.begin(),lisan.end(),b[i].r)-lisan.begin()+;
}
if(solve(a,b)&&solve(b,a))
puts("YES");
else
puts("NO");
return ;
}

D. New Year and Conference(区间交,线段树)的更多相关文章

  1. hdu 5700区间交(线段树)

    区间交 Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submiss ...

  2. HDU 5700 区间交 线段树暴力

    枚举左端点,然后在线段树内,更新所有左边界小于当前点的区间的右端点,然后查线段树二分查第k大就好 #include <cstdio> #include <cstring> #i ...

  3. 【BZOJ4653】【NOI2016】区间(线段树)

    [BZOJ4653][NOI2016]区间(线段树) 题面 BZOJ 题解 \(NOI\)良心送分题?? 既然是最大长度减去最小长度 莫名想到那道反复减边求最小生成树 从而求出最小的比值 所以这题的套 ...

  4. BZOJ_4653_[Noi2016]区间_线段树+离散化+双指针

    BZOJ_4653_[Noi2016]区间_线段树+离散化+双指针 Description 在数轴上有 n个闭区间 [l1,r1],[l2,r2],...,[ln,rn].现在要从中选出 m 个区间, ...

  5. xdoj-1324 (区间离散化-线段树求区间最值)

    思想 : 1 优化:题意是覆盖点,将区间看成 (l,r)转化为( l-1,r) 覆盖区间 2 核心:dp[i]  覆盖从1到i区间的最小花费 dp[a[i].r]=min (dp[k])+a[i]s; ...

  6. Codeforces Round #538 (Div. 2) F 欧拉函数 + 区间修改线段树

    https://codeforces.com/contest/1114/problem/F 欧拉函数 + 区间更新线段树 题意 对一个序列(n<=4e5,a[i]<=300)两种操作: 1 ...

  7. POJ 2528 - Mayor's posters - [离散化+区间修改线段树]

    题目链接:http://poj.org/problem?id=2528 Time Limit: 1000MS Memory Limit: 65536K Description The citizens ...

  8. 【题解】P1712 [NOI2016]区间(贪心+线段树)

    [题解]P1712 [NOI2016]区间(贪心+线段树) 一个observe是,对于一个合法的方案,将其线段长度按照从大到小排序后,他极差的来源是第一个和最后一个.或者说,读入的线段按照长度分类后, ...

  9. hdu-5700 区间交(二分+树状数组)

    题目链接: 区间交 Problem Description   小A有一个含有n个非负整数的数列与mm个区间.每个区间可以表示为l​i​​,r​i​​. 它想选择其中k个区间, 使得这些区间的交的那些 ...

  10. bzoj 3226 [Sdoi2008]校门外的区间(线段树)

    3226: [Sdoi2008]校门外的区间 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 615  Solved: 227[Submit][Stat ...

随机推荐

  1. java课程课后作业190502之单词统计续集

    第1步:输出单个文件中的前 N 个最常出现的英语单词. 功能1:输出文件中所有不重复的单词,按照出现次数由多到少排列,出现次数同样多的,以字典序排列. 功能2: 指定文件目录,对目录下每一个文件执行统 ...

  2. Angular js 复制粘贴

    关于copy到剪切板的实现需要引用Clipboard.min.js https://pan.baidu.com/s/1eStTJlo 页面如下所示,需要实现 点击copy字样 将id为content的 ...

  3. 2019 年 Google 编程之夏活动报告

    2019 年 Google 编程之夏活动报告 主要介绍了 GSoC 2019 活动的几个课题并讲述了整个活动的组织过程 Google 编程之夏活动不仅仅是一个夏日的实习项目,对于组织和一些社区的成员来 ...

  4. 利用IIS6提权获得管理员权限

    IIS6也是一个比较古老的提权EXP了,是通过利用WMI的权限来执行命令. 目标机:漏洞巨多的Win2003 下面说一下通过IIS6在已用菜刀连接上的服务器上运用IIS6获得管理员权限的过程. 1.将 ...

  5. SQL审核平台-Yearning安装部署实践

    相关文档: https://guide.yearning.io/ yearning简介 http://python.yearning.io/install/  yearning安装 Yearning ...

  6. 新iPhone要推出双卡双待这事是真的吗?

    自2007年发布以来,iPhone似乎一直都是"异类"--以自己独特的方式走着一条引领智能手机前进的路!如,在当年遍地按键键盘的年代,iPhone以触摸屏的奇葩姿态引领了新潮流:刚 ...

  7. nginx常用内置变量

    $args #请求中的参数值 $query_string #同 $args $arg_NAME #GET请求中NAME的值 $is_args #如果请求中有参数,值为"?",否则为 ...

  8. 目录服务不能与此服务器复制,因为距上一次与此服务器复制的时间已经超过了 tombstone 生存时间。

    1.PDC数据正常 2.其他DC无法复制,报如下错误:目录服务不能与此服务器复制,因为距上一次与此服务器复制的时间已经超过了 tombstone 生存时间. 3.直接强制复制即可 repadmin / ...

  9. Java学习十八

    学习内容: 1.Java集合 1.自定义的set类添加重复数据需要在实体类中添加hashcode和equals方法. 2.查找set对象信息(以宠物猫为例) //在集合中查找花花的信息并输出 if(s ...

  10. [C/C++]C/C++计算代码的运行时间

    有很多时候,实现一个功能后可能不仅仅要效果,还要效率,如果可以在极短的时间内完成一个功能那当然是最好不过的啦,但是可能经常会事与愿违. 这里就写一下,都可以怎样用C/C++或者Qt的方法来测试代码的运 ...