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

为了方便,再加入一个[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. Spring + SpringMVC配置

    代码结构如下 web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xs ...

  2. [Oracle]如何为数据库设置Event(eg: ORA-00235)

    [Oracle]如何为数据库设置Event(eg: ORA-00235) ■ When you use SPFILE, Setting procedure: 1. Check the current ...

  3. vue.js 2.0 官方文档学习笔记 —— 01. vue 介绍

    这是我的vue.js 2.0的学习笔记,采取了将官方文档中的代码集中到一个文件的形式.目的是保存下来,方便自己查阅. !官方文档:https://cn.vuejs.org/v2/guide/ 01. ...

  4. python删除文件与目录的方法

    python内置方法删除目录(空目录与非空目录)及文件 1.os.remove(file_path):删除文件 #PPTV是文件夹,xen.txt是文件 >>> os.remove( ...

  5. SSRS配置1:凭证和邮件

    SSRS是微软的高度集成的报表服务,通过报表服务配置管理器(Reporting Service Configuration Manager,简称RSCM),能够轻松实现报表的配置和管理,本文主要分享凭 ...

  6. .NetCore实践爬虫系统(二)自定义规则

    回顾 上篇文章NetCore实践爬虫系统(一)解析网页内容 我们讲了利用HtmlAgilityPack,输入XPath路径,识别网页节点,获取我们需要的内容.评论中也得到了大家的一些支持与建议.下面继 ...

  7. Egret(白鹭引擎)——Egret+fairyGui 实战项目入门

    前言 一行白鹭上青天 需求 最近,我们老板刷刷的为了省事,给美术减压(背景有点长,不说了). 美术出 fairygui,我需要在网页上看到实时操作,并且看到效果! 需求分析 这怕是要了我的狗命啊,但是 ...

  8. SSM整合配置(Spring+Spring MVC+Mybatis)

    一.配置准备   通过Maven工程,在eclipse中整合SSM,并在Tomcat服务器上运行 在进行配置前,先理清楚要配置哪些文件,如图,除web.xml外,其余三个配置文件名称均可自定义: 如图 ...

  9. Python_Xlrd&Xlwt

    import xlrd # \U 开始的字符被编译器认为是八进制 解决方法 r objWB = xlrd.open_workbook(r'C:\Users\IBM\Desktop\S1\7月下旬入库表 ...

  10. pie的绕过方式

    目标程序下载 提取码:qk1y 1.检查程序开启了哪些安全保护机制 pie机制简介 PIE(position-independent executable) 是一个针对代码段.text, 数据段.*d ...