贪心地,可以建出一棵树,每个区间对应一个点,它的父亲是它右边的、与它不相交的、右端点最小的区间。

为了方便,再加入一个[0,0]区间

于是就可以倍增来做出从某个区间开始,一直到某个右界,这之中最多能选多少区间

这样的话,可以从[0,0]区间,倍增做出第一问的答案

考虑第二问,我们需要尽量选编号小的区间,于是只要判断我们如果选了这个区间 还能不能选够那么多就可以了

而且前面已经选过的就钦定住了

开一个set来放下已经选过的区间,按左端点从小到大排序

为了方便,一开始先把[0,0]区间和[inf,inf]区间加进去。设当前区间是x

这样的话,只要找到前驱pre、后继nxt,判断pre、nxt是否和x相交,相交就不做了

然后看从pre到nxt能选几个、(pre到x)+(x到nxt)+1能选几个,看看是否相等,来判断选不选x

 #include<bits/stdc++.h>
#define pa pair<int,int>
#define CLR(a,x) memset(a,x,sizeof(a))
using namespace std;
typedef long long ll;
const int maxn=2e5+,inf=1e9+; inline ll rd(){
ll x=;char c=getchar();int neg=;
while(c<''||c>''){if(c=='-') neg=-;c=getchar();}
while(c>=''&&c<='') x=x*+c-'',c=getchar();
return x*neg;
} struct Node{
int l,r,i;
Node (int a=,int b=,int c=){l=a,r=b,i=c;}
}pos[maxn],pos2[maxn],pos3[maxn];
bool operator < (Node a,Node b){return a.l<b.l;}
int N,M;
int ma[maxn*],fa[maxn][],cnt[maxn][];
set<Node> st;
bool flag[maxn]; inline bool cmp(Node a,Node b){return a.l<b.l;}
inline bool cmp2(Node a,Node b){return a.r<b.r;} inline int getst(int x,int bnd){
int re=;
for(int i=;i>=;i--){
if(fa[x][i]&&pos2[fa[x][i]].r<bnd)
re+=cnt[x][i],x=fa[x][i];
}
return re;
} int main(){
//freopen("","r",stdin);
int i,j,k;
N=rd();
for(i=,j=;i<=N;i++){
pos[i].l=rd(),pos[i].r=rd();pos[i].i=i;
}
memcpy(pos2,pos,sizeof(pos));
memcpy(pos3,pos,sizeof(pos));
sort(pos+,pos+N+,cmp);
sort(pos3+,pos3+N+,cmp2);
int mm=inf,mi=;
for(i=N,j=N;i;i--){
for(;pos[j].l>pos3[i].r;j--){
if(pos[j].r<mm) mm=pos[j].r,mi=pos[j].i;
}
int x=pos3[i].i;
fa[x][]=mi;cnt[x][]=;
// printf("%d %d\n",x,fa[x][0]);
for(k=;fa[x][k]&&fa[fa[x][k]][k];k++){
fa[x][k+]=fa[fa[x][k]][k];
cnt[x][k+]=cnt[x][k]+cnt[fa[x][k]][k];
}
}
fa[N+][]=pos3[].i;cnt[N+][]=;
for(k=;fa[N+][k]&&fa[fa[N+][k]][k];k++){
fa[N+][k+]=fa[fa[N+][k]][k];
cnt[N+][k+]=cnt[N+][k]+cnt[fa[N+][k]][k];
}
printf("%d\n",getst(N+,inf)); st.insert(Node(,,N+));st.insert(Node(inf,inf,N+));
for(i=;i<=N;i++){
set<Node>::iterator it=st.lower_bound(pos2[i]);
Node nxt=*it;
Node pre=*(--it);
if(nxt.l<=pos2[i].r||pre.r>=pos2[i].l) continue;
int n1=getst(pre.i,pos2[i].l)+getst(i,nxt.l)+;
int nn=getst(pre.i,nxt.l);
// printf("%d %d %d %d %d\n",i,pre.i,nxt.i,nn,n1);
if(n1<nn) continue;
flag[i]=;
st.insert(pos2[i]);
}
for(i=;i<=N;i++) if(flag[i]) printf("%d ",i);
return ;
}

bzoj1178/luogu3626 会议中心 (倍增+STL::set)的更多相关文章

  1. 【BZOJ-1178】CONVENTION会议中心 倍增 + set (神思路好题!)

    1178: [Apio2009]CONVENTION会议中心 Time Limit: 15 Sec  Memory Limit: 162 MBSubmit: 812  Solved: 323[Subm ...

  2. BZOJ1178 APIO2009 会议中心 贪心、倍增

    传送门 只有第一问就比较水了 每一次贪心地选择当前可以选择的所有线段中右端点最短的,排序之后扫一遍即可. 考虑第二问.按照编号从小到大考虑每一条线段是否能够被加入.假设当前选了一个区间集合\(T\), ...

  3. BZOJ1178 [Apio2009]CONVENTION会议中心

    本文作者:ljh2000作者博客:http://www.cnblogs.com/ljh2000-jump/转载请注明出处,侵权必究,保留最终解释权! Description Siruseri政府建造了 ...

  4. bzoj1178 [Apio2009]CONVENTION会议中心 区间dp+贪心

    [Apio2009]CONVENTION会议中心 Time Limit: 15 Sec  Memory Limit: 162 MBSubmit: 1130  Solved: 444[Submit][S ...

  5. [APIO2009]会议中心

    [APIO2009]会议中心 题目大意: 原网址与样例戳我! 给定n个区间,询问以下问题: 1.最多能够选择多少个不相交的区间? 2.在第一问的基础上,输出字典序最小的方案. 数据范围:\(n \le ...

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

    1178: [Apio2009]CONVENTION会议中心 https://lydsy.com/JudgeOnline/problem.php?id=1178 分析: set+倍增. 首先把所有有包 ...

  7. 会议中心[APIO2009]

    会议中心 思路 这一题的正解是倍增的,但是由于我太蒟蒻了,所以我选了一个不算正解但是有可以拿满分的题目学习 思路和我考场上其实差不多,只是我无法实现.... 下面我先来介绍几个数组的用途 1.s,s数 ...

  8. 【题解】[APIO2009]会议中心

    [题解][P3626 APIO2009]会议中心 真的是一道好题!!!刷新了我对倍增浅显的认识. 此题若没有第二份输出一个字典序的方案,就是一道\(sort+\)贪心,但是第二问使得我们要用另外的办法 ...

  9. [APIO2009]会议中心(贪心)

    P3626 [APIO2009]会议中心 题目描述 Siruseri 政府建造了一座新的会议中心.许多公司对租借会议中心的会堂很 感兴趣,他们希望能够在里面举行会议. 对于一个客户而言,仅当在开会时能 ...

随机推荐

  1. 有关java(初学笔记)

    JAVA的主要优势:跨平台性,可以在Linux,windows,mac三个系统上运行. 跨平台的核心:JAVA虚拟机--JVM 原理就是将Java语言在这个系统上翻译.JAVA在jvm上运行,jvm进 ...

  2. 关于新版SDK报错You need to use a Theme.AppCompat theme的两种解决办法 - 转

    android的一个小问题: Caused by: java.lang.IllegalStateException: You need to use a Theme.AppCompat theme ( ...

  3. HTML基础之JS

    HTML中的三把利器的JS 又称为JavaScript,看着好像和Java有点联系,实际上他和java半毛钱关系都没有,JavaScript和我们学习的Python.Go.Java.C++等,都是一种 ...

  4. how2j 的shiro教程初探

    教程案例里的mysql连接器只支持mysql,不支持mariadb,如果用的不是mysql,创建连接时会报错.

  5. QQ快速登录协议分析以及风险反思

    前言 众所周知,Tencent以前使用Activex的方式实施QQ快速登录,现在快速登录已经不用控件了.那现在用了什么奇葩的方法做到Web和本地的应用程序交互呢?其实猜测一下,Web和本地应用进行交互 ...

  6. 初级字典树查找在 Emoji、关键字检索上的运用 Part-3

    系列索引 Unicode 与 Emoji 字典树 TrieTree 与性能测试 生产实践 生产实践 我们最终要解决 Emoji 在浏览器和打印物上的显示一致. 进行了多番对比,,在显示效果和精度上,m ...

  7. 用Unity简单实现第三人称人物的移动和转向

    上图不重要,因为实现人物的移动用的是动画,没有什么可说的,主要是下面实现人物的转向. 比如在一个平面中,玩家按了w和d键则人物会面向右前方向前进,如果此时玩家按了a和s键则人物会面向左后方向前进,那么 ...

  8. 菜鸟凉经(华为、firehome、大华)

    面试通知都是前一天来的,准备的时间很少,所以表现也不是特别满意,来看面经吧: 华为一面(IT应用工程师): 1.自我介绍:(华为面试都是1对1,面前的是个温柔的小哥,挺放松的) 2.你主要会的it技术 ...

  9. django反向解析URL和URL命名空间

    django反向解析URL和URL命名空间 首先明确几个概念: 1.在html页面上的内容特别是向用户展示的url地址,比如常见的超链接,图片链接等,最好能动态生成,而不要固定. 2.一个django ...

  10. #个人博客作业Week1——浏览教材后提出的5个问题

    1.对于MSF的团队模型,请问是团队中的哪个角色监督9项原则的实现?是否会浪费时间和精力在践行9项原则上?2.在调查用户需求和用户体验时如何让不同阶层的用户更多的参与度?3.想成为一位优秀的PM需要从 ...