bzoj1178/luogu3626 会议中心 (倍增+STL::set)
贪心地,可以建出一棵树,每个区间对应一个点,它的父亲是它右边的、与它不相交的、右端点最小的区间。
为了方便,再加入一个[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)的更多相关文章
- 【BZOJ-1178】CONVENTION会议中心 倍增 + set (神思路好题!)
1178: [Apio2009]CONVENTION会议中心 Time Limit: 15 Sec Memory Limit: 162 MBSubmit: 812 Solved: 323[Subm ...
- BZOJ1178 APIO2009 会议中心 贪心、倍增
传送门 只有第一问就比较水了 每一次贪心地选择当前可以选择的所有线段中右端点最短的,排序之后扫一遍即可. 考虑第二问.按照编号从小到大考虑每一条线段是否能够被加入.假设当前选了一个区间集合\(T\), ...
- BZOJ1178 [Apio2009]CONVENTION会议中心
本文作者:ljh2000作者博客:http://www.cnblogs.com/ljh2000-jump/转载请注明出处,侵权必究,保留最终解释权! Description Siruseri政府建造了 ...
- bzoj1178 [Apio2009]CONVENTION会议中心 区间dp+贪心
[Apio2009]CONVENTION会议中心 Time Limit: 15 Sec Memory Limit: 162 MBSubmit: 1130 Solved: 444[Submit][S ...
- [APIO2009]会议中心
[APIO2009]会议中心 题目大意: 原网址与样例戳我! 给定n个区间,询问以下问题: 1.最多能够选择多少个不相交的区间? 2.在第一问的基础上,输出字典序最小的方案. 数据范围:\(n \le ...
- 1178: [Apio2009]CONVENTION会议中心
1178: [Apio2009]CONVENTION会议中心 https://lydsy.com/JudgeOnline/problem.php?id=1178 分析: set+倍增. 首先把所有有包 ...
- 会议中心[APIO2009]
会议中心 思路 这一题的正解是倍增的,但是由于我太蒟蒻了,所以我选了一个不算正解但是有可以拿满分的题目学习 思路和我考场上其实差不多,只是我无法实现.... 下面我先来介绍几个数组的用途 1.s,s数 ...
- 【题解】[APIO2009]会议中心
[题解][P3626 APIO2009]会议中心 真的是一道好题!!!刷新了我对倍增浅显的认识. 此题若没有第二份输出一个字典序的方案,就是一道\(sort+\)贪心,但是第二问使得我们要用另外的办法 ...
- [APIO2009]会议中心(贪心)
P3626 [APIO2009]会议中心 题目描述 Siruseri 政府建造了一座新的会议中心.许多公司对租借会议中心的会堂很 感兴趣,他们希望能够在里面举行会议. 对于一个客户而言,仅当在开会时能 ...
随机推荐
- WPF Get jiayuan outbox list(send mail box)
Request URL: http://www.jiayuan.com/msg/outbox/list.php Request Method: POST form data: type=all&a ...
- python基础2之字符串、列表、字典、集合
内容概要: 一.python2 or 3 二.字符串拼接 三.字符串 四.列表.元祖 五.字典 六.集合 七.练习 一.python2 or python3 目前大多使用python2.7,随着时间的 ...
- mfc 进程的诞生和死亡
进程概念 进程的诞生 进程的死亡 一. 进程: .简单的说 双击一个EXE图标时,系统就会产生一个相应的进程,分配相应的资源,并执行相应的代码. .标准一些的说法: 进程是一个具有独立功能 ...
- C++中前置声明介绍
前置声明是指对类.函数.模板或者结构体进行声明,仅仅是声明,不包含相关具体的定义.在很多场合我们可以用前置声明来代替#include语句. 类的前置声明只是告诉编译器这是一个类型,但无法告知类型的大小 ...
- libgdx学习记录7——Ui
libgdx中的UI设计主要通过其对应的Style类进行实现,也可以通过skin实现.如果没有编辑好的skin文件,可以创建一个默认的skin,再添加已经设计好的style类即可,然后在需要使用的地方 ...
- 未能使用“Csc”任务的输入参数初始化该任务
今天.NetCore2.1版本,建立Asp.net Core web应用程序项目时,报以下错误: 未能使用“Csc”任务的输入参数初始化该任务. “Csc”任务不支持“SharedCompilatio ...
- 6、Docker图形化管理(Portainer)
一.Portainer简介 Portainer是Docker的图形化管理工具,提供状态显示面板.应用模板快速部署.容器镜像网络数据卷的基本操作(包括上传下载镜像,创建容器等操作).事件日志显示.容器控 ...
- mongodb分片集群
第一章 1.mongodb 分片集群解释和目的 一组Mongodb复制集,就是一组mongod进程,这些进程维护同一个数据集合.复制集提供了数据冗余和高等级的可靠性,这是生产部署的基础. 第二章 1. ...
- 并发系列(一)-----synchronized关键字
一 简介 说到并发不得不提的synchronized,synchronized关键字是元老级别的角色.在Java SE 1.6之前synchronized被称为是重量,在1.6之后对同步进行了一系列的 ...
- LeetCode 刷题笔记 1. 两数之和(Two Sum)
tag: 栈(stack) 题目描述 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案. ...