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 ...
随机推荐
- SFINAE 与 type_traits
SFINAE 与 type_traits SFINAE 替换失败不是错误 (Substitution Failure Is Not An Error),此特性被用于模板元编程. 在函数模板的重载决议中 ...
- Pycharm2020最新激活码|永久激活(附最新激活码和插件)
最近很多人的Pycharm激活时间又过期了,后台很多人索要激活码,我就再把激活的方法汇和工具再梳理一次给大家. 最主要有两种激活方式(两种方式需要的激活码不同): 一.激活码激活: 一般一年多需要激活 ...
- swift中block的使用
在OC中习惯用block来传值,而swift中,block被重新定义了一下,叫闭包: 使用的技巧:谁定义谁传值: 案例使用A.B控制器: 1~4步在B中执行,最后在A中执行: - B控制器: 1- ...
- mariadb主从
实验环境: 两台centos7 master:192.168.1.6 slave:192.168.1.7 一.安装mariadb服务 [root@master ~]# yum -y install m ...
- springboot 启动时加载数据库数据到本地Map
InitDataConfig.java import cn.hutool.core.collection.CollUtil; import cn.hutool.core.lang.Dict; impo ...
- C语言备忘录——向上取整
众所周知,C语言的取整方式是向下取整,昨天老师留了一道思考题,问我们C语言怎么向上取整,当时我第一反应就是ceil(),老师说不能用if……else之类的,函数也不行.当时想了想没事不用就不用,去ma ...
- 数组 bash shell
http://www.cnblogs.com/chengmo/archive/2010/09/30/1839632.html #!/bin/bash # 脚本检测到离线主机会发送邮件通知,可一直运行. ...
- HashMap面试总结
作者:孤独烟 出处: http://rjzheng.cnblogs.com/ 文章由点及线再及面,写的非常好.修改部分内容 (1) HashMap的实现原理 看过HashMap源码吗,知道原理吗? h ...
- JSP变量、方法和类的声明,JSP程序片,JSP表达式
参考文章 http://c.biancheng.net/view/1431.html http://c.biancheng.net/view/1433.html http://c.biancheng. ...
- Spring Cloud Alibaba 教程 | 前世今生
Spring Cloud Alibaba是什么 先来看一下官方是怎么定义Spring Cloud Alibaba的: Spring Cloud Alibaba 致力于提供微服务开发的一站式解决方案.此 ...