题: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. 洛谷 P1504 积木城堡

    题目传送门 解题思路: 01背包. AC代码: #include<iostream> #include<cstdio> #include<vector> using ...

  2. cf 609E.Minimum spanning tree for each edge

    最小生成树,lca(树链剖分(太难搞,不会写)) 问存在这条边的最小生成树,2种情况.1.这条边在原始最小生成树上.2.加上这条半形成一个环(加上),那么就找原来这条边2端点间的最大边就好(减去).( ...

  3. StringBuffer类、StringBuilder类详解

    StringBuffer是一个字符串缓冲区,是一个容器,而且长度可变,可以直接操作多个数据类型, 最终会通过toString()方法变成字符串. 容器的功能有: 1.存储 public StringB ...

  4. APP分享视频H5页面

    男左女右中国APP需要做一个APP分享视频H5页面,效果图见下面的图. 出现的问题: (1)URL参数为中文的时候乱码: (2)vedio点击默认是QQ,微信的播放器: (3)给视频添加一个默认的封面 ...

  5. 读书笔记 - js高级程序设计 - 第六章 面向对象的程序设计

      EcmaScript有两种属性 数据属性 和 访问器属性 数据属性有4个特性 Configurable Enumerable Writable Value   前三个值的默认值都为false   ...

  6. map/vector遍历删除

    map遍历删除 map<int, vector<int>>::iterator it = g_map.begin(); for (; it != g_map.end(); /* ...

  7. Scheduled定时任务器在Springboot中的使用

    Scheduled定时任务器是Spring3.0以后自带的一个定时任务器. 使用方式: 1.添加依赖 <!-- 添加 Scheduled 坐标 --> <dependency> ...

  8. Spring框架-IOC和AOP

    IOC:它并不是一种技术实现,而是一种设计思想.在任何一个有实际开发意义的程序项目中,我们会使用很多类来描述它们特有的功能,并且通过类与类之间的相互协作来完成特定的业务逻辑.这个时候,每个类都需要负责 ...

  9. hook截获自定义消息

    unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms ...

  10. 正则表达式模式修正符 比如/esi

    正则表达式模式修正符 比如/esi 作者: 字体:[增加 减小] 类型:转载 下面列出了当前在 PCRE 中可能使用的修正符.括号中是这些修正符的内部 PCRE 名.修正符中的空格和换行被忽略,其它字 ...