D. New Year and Conference(区间交,线段树)
题: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(区间交,线段树)的更多相关文章
- hdu 5700区间交(线段树)
区间交 Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submiss ...
- HDU 5700 区间交 线段树暴力
枚举左端点,然后在线段树内,更新所有左边界小于当前点的区间的右端点,然后查线段树二分查第k大就好 #include <cstdio> #include <cstring> #i ...
- 【BZOJ4653】【NOI2016】区间(线段树)
[BZOJ4653][NOI2016]区间(线段树) 题面 BZOJ 题解 \(NOI\)良心送分题?? 既然是最大长度减去最小长度 莫名想到那道反复减边求最小生成树 从而求出最小的比值 所以这题的套 ...
- BZOJ_4653_[Noi2016]区间_线段树+离散化+双指针
BZOJ_4653_[Noi2016]区间_线段树+离散化+双指针 Description 在数轴上有 n个闭区间 [l1,r1],[l2,r2],...,[ln,rn].现在要从中选出 m 个区间, ...
- xdoj-1324 (区间离散化-线段树求区间最值)
思想 : 1 优化:题意是覆盖点,将区间看成 (l,r)转化为( l-1,r) 覆盖区间 2 核心:dp[i] 覆盖从1到i区间的最小花费 dp[a[i].r]=min (dp[k])+a[i]s; ...
- Codeforces Round #538 (Div. 2) F 欧拉函数 + 区间修改线段树
https://codeforces.com/contest/1114/problem/F 欧拉函数 + 区间更新线段树 题意 对一个序列(n<=4e5,a[i]<=300)两种操作: 1 ...
- POJ 2528 - Mayor's posters - [离散化+区间修改线段树]
题目链接:http://poj.org/problem?id=2528 Time Limit: 1000MS Memory Limit: 65536K Description The citizens ...
- 【题解】P1712 [NOI2016]区间(贪心+线段树)
[题解]P1712 [NOI2016]区间(贪心+线段树) 一个observe是,对于一个合法的方案,将其线段长度按照从大到小排序后,他极差的来源是第一个和最后一个.或者说,读入的线段按照长度分类后, ...
- hdu-5700 区间交(二分+树状数组)
题目链接: 区间交 Problem Description 小A有一个含有n个非负整数的数列与mm个区间.每个区间可以表示为li,ri. 它想选择其中k个区间, 使得这些区间的交的那些 ...
- bzoj 3226 [Sdoi2008]校门外的区间(线段树)
3226: [Sdoi2008]校门外的区间 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 615 Solved: 227[Submit][Stat ...
随机推荐
- content编码
1.content有5种属性 a.content:“” //为空 b.content:attr(TItle) //可以获取当前选中标签的属性值 eg: ...
- Vulkan SDK之 Swapchain
Swapchain是一系列最终会展示给用户的图像的集合. /* * Set up swapchain: * - Get supported uses for all queues * - Try to ...
- maven项目中WEB-INF的父目录必须叫webapp吗?
这个并不是必须的,可以在pom配置文件中修改,如下所示: <webappDirectory>src/main/WebContent</webappDirectory> ...
- 干货分享:Essay写作收集论据的三个方法
在很多时候,中国留学生写出的Essay在西方学术界看来是存在plagiarism的情况.并不是说咱们写的所有东西都是抄袭,而是思维逻辑和利用证据的方式与西方权威的academic writing不同. ...
- map构造同时初始化
Map<String, Object> mtest = new HashMap<String, Object>(){{put("test","M ...
- LeetCode做题笔记之动态规划
LeetCode之动态规划 时间有限只做了下面这几道:70.338.877.96.120.95.647,后续会继续更新 70:爬楼梯 先来道简单的练练手,一道经典的动态规划题目 可以采用动态规划的备忘 ...
- Vuex 是什么
Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式.它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化.Vuex 也集成到 Vue 的官方调试工具 ...
- POJ 1745:Divisibility 枚举某一状态的DP
Divisibility Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 11001 Accepted: 3933 Des ...
- c++ 字母排序
char a[123] = {'Z', 's', 'p', 'l', 'j', 'r', 'q', 'v', 'n', 'm', 'C', 'F', 'D', 'B', 'A', '2', '0', ...
- JavaEE--JNDI(下,实现)
参考:https://blog.csdn.net/ouyida3/article/details/46699023 https://www.landui.com/help/show-6158.htm ...