BZOJ
洛谷


\(Description\)

给定\(n\)个区间\([L_i,R_i]\),要选出尽量多的区间,并满足它们互不相交。求最多能选出多少个的区间以及字典序最小的方案。
\(n\leq2\times10^5\)。

\(Solution\)

第一问随便做。
对于第二问,从小到大枚举区间\([l_i,r_i]\),我们需要判断此时能不能选\([l_i,r_i]\)。
在之前选的区间中,设在\(i\)左边离\(l_i\)最近的区间的右端点是\(L\),在\(i\)右边离\(i\)最近的左端点是\(R\)。
显然要满足\(i\)与选中的区间不相交,有\(L<l_i\)且\(R>r_i\)。同时这两个区间在已选择的区间中一定是相邻的。可以\(set\)维护选择的区间,\(lower\_bound\)一次找出。

满足不相交后,还要满足最优。
令\(Ans(l,r)\)表示用在\([l,r]\)能选出的最多区间数。
那么能放入区间\([l_i,r_i]\)还要满足\(Ans(L+1,R-1)==Ans(L+1,l_i-1)+Ans(r_i+1,R-1)+1\)。很好理解。(只判\(i\)的前后缀显然不对啊)

如何求\(Ans(l,r)\)?
二分可以找到第一个满足\(l_i\geq l\)的区间\(i\),然后从\(i\)往后选,直到右端点\(>r\)。根据最简单的贪心,每选一个区间下一次选择的区间是确定的。so可以倍增,令\(f[i][j]\)表示从区间\(i\)开始选,选了\(2^j\)个区间后,停在哪个区间。
显然此时可以把完全包含其它区间的大区间给去掉,而且需要去掉(如果选到它们会影响答案)。


//21632kb   880ms
#include <set>
#include <cstdio>
#include <cctype>
#include <algorithm>
//#define gc() getchar()
#define MAXIN 500000
#define gc() (SS==TT&&(TT=(SS=IN)+fread(IN,1,MAXIN,stdin),SS==TT)?EOF:*SS++)
typedef long long LL;
const int N=2e5+5,INF=1<<30;int cnt,Bit,L[N],R[N],f[18][N];
char IN[MAXIN],*SS=IN,*TT=IN;
struct Node
{int l,r,id;bool operator <(const Node &x)const{return r==x.r?l>x.l:r<x.r;}
}A[N],tmp[N];inline int read()
{int now=0;register char c=gc();for(;!isdigit(c);c=gc());for(;isdigit(c);now=now*10+c-48,c=gc());return now;
}
inline int Find(int x)
{int l=1,r=cnt,mid;//cnt+1!(l may be greater than l[cnt])while(l<r)if(L[mid=l+r>>1]<x) l=mid+1;else r=mid;return l;
}
inline int Calc(int l,int r)
{if(L[cnt]<l) return 0;int p=Find(l);if(R[p]>r) return 0;int res=1;for(int i=Bit; ~i; --i)if(R[f[i][p]]<=r) res+=1<<i, p=f[i][p];return res;
}int main()
{const int n=read();for(int i=1; i<=n; ++i) A[i]=tmp[i]=(Node){read(),read()};std::sort(tmp+1,tmp+1+n), cnt=1;for(int i=2; i<=n; ++i) if(tmp[i].l>tmp[cnt].l) tmp[++cnt]=tmp[i];//左右端点应该都是单调的 for(int i=1; i<=cnt; ++i) L[i]=tmp[i].l, R[i]=tmp[i].r;L[cnt+1]=INF+1, R[0]=R[cnt+1]=INF+1;//INF+1!(后面会查l~INF)for(int i=1,j=1; i<=cnt; ++i){while(L[j]<=R[i]) ++j;f[0][i]=j;}for(; 1<<Bit+1<=cnt; ++Bit);for(int j=1; j<=Bit; ++j)for(int i=1; i<=cnt; ++i)f[j][i]=f[j-1][f[j-1][i]];int ans=Calc(1,INF-1); printf("%d\n",ans);std::set<Node> st;st.insert((Node){0,0}), st.insert((Node){INF,INF});for(int i=1,k=0; i<=n; ++i){int l=A[i].l, r=A[i].r;std::set<Node>::iterator it=st.lower_bound(A[i]);int R=(*it).l; if(r>=R) continue;int L=(*(--it)).r; if(l<=L) continue;if(Calc(L+1,R-1)==Calc(L+1,l-1)+Calc(r+1,R-1)+1)if(++k!=ans) printf("%d ",i), st.insert(A[i]);else {printf("%d",i); break;}}return 0;
}

转载于:https://www.cnblogs.com/SovietPower/p/10339161.html

BZOJ.1178.[APIO2009]会议中心(贪心 倍增)相关推荐

  1. 【BZOJ 1178】 [Apio2009]CONVENTION会议中心

    1178: [Apio2009]CONVENTION会议中心 Time Limit: 15 Sec Memory Limit: 162 MB Submit: 539 Solved: 209 [Subm ...

  2. 1178: [Apio2009]CONVENTION会议中心

    1178: [Apio2009]CONVENTION会议中心 Time Limit: 15 Sec   Memory Limit: 162 MB Submit: 824   Solved: 327 [ ...

  3. BZOJ 1178 APIO 2009 会议中心

    提示: 1. NOIP开车旅行做过的小伙伴肯定能搞定此题 这个题目网上题解很多 , 这里不赘述 , 提供一个可读一些的代码实现: #include <iostream> #include ...

  4. ★☆【平衡二叉树】【倍增】会议中心

    Siruseri政府建造了一座新的会议中心.许多公司对租借会议中心的会堂很感兴趣,他们希望能够在里面举行会议. 对于一个客户而言,仅当在开会时能够独自占用整个会堂,他才会租借会堂.会议中心的销售主管认 ...

  5. acmore|acmore.cc1211采油区域1212会议中心1213抢掠计划APIO2009

    采油区域: #include <iostream> #include <algorithm> #include <cstdio> #include <cstd ...

  6. 最多可以参加的会议数目--贪心算法

    LeetCode 最多可以参加的会议数目 给你一个数组 event ,其中 events[i] = [startDayi, endDayi] ,表示会议 i 开始于 startDayi ,结束于 en ...

  7. SVS为某公司打造先进的无纸化会议中心

    SVS此次为某公司打造一个无纸化会议中心,会场一共设置35个席位,为每个席位布置了桌面液晶升降器+话筒升降器,两者分开升降,可以轻松实现普通会议.多媒体会议.无纸化会议等多种会议模式. 超薄液晶屏升降 ...

  8. 新闻!龙漫集团“有艺翼”行动@Kid.ArtWing+国际少儿艺术展在国家会议中心开幕

    2019年1月26日,2019年1月26日,龙漫集团战略副总裁姚華先生发起的龙漫星际乐园 x 龙漫星际国际动漫谷"有艺翼"行动 ICAE国际儿童画展@Kid.ArtWing+国际少 ...

  9. 新闻!版权猫的进击!ip猫ipMALL.io@Kid.ArtWing+国际少儿艺术展在国家会议中心开幕

    2019年1月26日,2019年1月26日,龙漫集团战略副总裁姚華先生发起的龙漫星际乐园 x 龙漫星际国际动漫谷"有艺翼"行动 ICAE国际儿童画展@Kid.ArtWing+国际少 ...

最新文章

  1. 牛客练习赛32 -- Xor Path
  2. mybatisplus自动生成id_mybatisPlus自动代码生成实例(超级简单使用)
  3. RHEL部署ipa红帽身份验证
  4. 打车APP大数据宰客套路多:苹果比安卓贵、熟客比新客贵
  5. Silverlight 解谜游戏 之十三 游戏暗示(2)
  6. 简单纯文字浮动信息-Tooltip
  7. 8小时删除,这波资源碉堡了 ! @所有人
  8. 2021年广东高考各科成绩查询,2017年广东高考成绩五种查询方式一览
  9. Windows7 下载android源码
  10. 8Uftp连接服务器错误
  11. 使用信号量机制解决家庭吃水果问题。
  12. Excel文档保护密码破解
  13. 使用kettle向HBase导入数据
  14. UBUNTU-Mplay
  15. HTML基础常识问答(三)
  16. 选课系统源码html,高校选课系统 - WEB源码|源代码 - 源码中国
  17. 中文拼音首字母排序比较器
  18. ps4手柄驱动linux,Arduino和单片机区别,及Arduino入门教程
  19. Java中求集合交集、并集、差集
  20. 访问www.baidu.com全过程

热门文章

  1. Linux下批量添加用户
  2. python基础小结(麻瓜图文总结版)
  3. python读取json文件多个json数据_Python 加载包含多个JSON对象的JSON文件
  4. Python判断某一天是该年的第几天
  5. 英语计算机职称考试查询成绩,北京职称外语计算机成绩长期有效
  6. case when then else_啃食Oracle:条件分支表达式CASE
  7. qcow2镜像转换为iso_电子数据镜像格式的转换,以qcow2转raw为例
  8. Linux之vi 文本编辑命令
  9. 课节5:图神经网络算法(二):GraphSage实践
  10. mysql系列:登陆和退出