题: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. Angular全局数据管理与同步更新

    自定义实现angular中数据的状态管理,如有不妥请指正 一.先介绍一下rxjs中subject: Import {subject}from’rxjs’ Subject 数据的订阅与分发,结合报刊的发 ...

  2. 17 —— 服务端渲染 —— art-template

    一,前端渲染数据 的弊端 仿 apache 服务器与客户端的几次交互: 1,加载静态页面 2,加载静态资源 3,发送 ajax 请求 ,接收请求并处理返回 . 4,前端浏览器接收数据循环遍历. 存在的 ...

  3. 11 ~ express ~ 解决 cookie 中文报错的问题

    使用cookies包需要注意:1,cookie中是不能有中文的,一旦有中文,就会报错2,cookie是通过 中间件的形式直接挂载到 req对象上的,那么cookies有的方法,req.cookies就 ...

  4. POJ_3122 经典二分题

    Pie Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 8594   Accepted: 3124   Special Jud ...

  5. echars的使用

    1.首先引入echars的js文件 该文件可从echars官网下载 在某些图表中可能会引用ecStat.js文件 如线性回归散点图 我们直接下载引用即可 <head> <title& ...

  6. SQL注入类型

    本文转自:https://www.cnblogs.com/cui0x01/p/6322826.html Sql注入_类型 1.sql注入 通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询 ...

  7. 2020年9大顶级Java框架

    诞生于1995年的Java,目前已在134,861个网站上广泛使用,包括ESPN.SnapDeal等.在其24年的成长史中,Java已经证明了自己是用于自定义软件开发的顶级通用编程语言. Java广泛 ...

  8. day27(027-反射&JDK新特性)

    ###27.01_反射(类的加载概述和加载时机) A:类的加载概述 *加载   就是指将class文件读入内存,并为之创建一个Class对象.任何类被使用时系统都会建立一个Class对象. *连接  ...

  9. springboot 潜入式web容器

    普通servlet 容器 1.tomcat <dependency> <groupId>org.springframework.boot</groupId> < ...

  10. 使用mysql的注意事项

    1,文件导入:LOAD DATA INFILE '/tmp/pet.txt' INTO TABLE pet FIELDS TERMINATED BY ',' LINES TERMINATED BY ' ...