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

为了方便,再加入一个[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. 从0开始学golang--2.1--如何去爬园子的数据

    20天过去了,才开始写...主要还是因为自己懒吧.之前一边上班一边也有挤时间练习golang,可是写博客却老是不能行动,跑步也没跑了.突然的就懈怠了快一个月.可能也和开始玩the elder scro ...

  2. Kafka下的生产消费者模式与订阅发布模式

    原文:https://blog.csdn.net/zwgdft/article/details/54633105   在RabbitMQ下的生产消费者模式与订阅发布模式一文中,笔者以“数据接入”和“事 ...

  3. redis系列--你真的入门了吗?redis4.0入门~

    前言 redis作为nosql家族中非常热门的一员,也是被大型互联网公司所青睐,无论你是开发.测试或者运维,学习掌握它总会为你的职业生涯增色添彩. 当然,你或多或少已经了解redis,但是你是否了解其 ...

  4. 20155227《网络对抗》Exp9 Web安全基础实践

    20155227<网络对抗>Exp9 Web安全基础实践 实验内容 关于WebGoat Cross-Site Scripting(XSS)练习 Injection Flaws练习 CSRF ...

  5. stm32的PWM占空比

    PWM一共有两种模式,PWM1模式:CNT<CRRx为有效电平.CNT>CRRx为无效电平.PWM2模式相反. 有限电平通过设置极性来确定: TIM_OCInitStructure.TIM ...

  6. Linux下的openvpn配置 与 easy-rsa3的证书生成

    #注意:以下操作由服务端操作即可#PS:为什么我找不到var文件??============安装===============wget -O /etc/yum.repos.d/epel.repo ht ...

  7. CS229笔记:支持向量机

    考虑一个分类问题,用\(1\)表示正类标签,用\(-1\)表示负类标签,引入假设函数\(h\): \[ \begin{align*} g(z) &= \begin{cases} 1 & ...

  8. Spark RDD深度解析-RDD计算流程

    Spark RDD深度解析-RDD计算流程 摘要  RDD(Resilient Distributed Datasets)是Spark的核心数据结构,所有数据计算操作均基于该结构进行,包括Spark ...

  9. 前后端同学必会的Linux基础命令

    无论是前端还是后端同学,一些常用的linux命令还是必须要掌握的.发布版本.查看日志等等都会用到.以下是我简单的总结了一些简单又常用的命令,欢迎大家补充.希望能帮助到大家 基础篇 1.进入目录 cd ...

  10. c# winform调用摄像头识别二维码

    首先我们需要引用两个第三方组件:AForge和zxing. Aforge是摄像头操作组件,zxing是二维码识别组件.都是开源项目.避免重复造轮子. 其实一些操作代码我也是参照别人的,若侵犯您的版权, ...