传送门

好迷的思路……

首先,如果只有第一问就是个贪心,排个序就行了

对于第二问,我们考虑这样的一种构造方式,每一次都判断加入一个区间是否会使答案变差,如果不会的话就将他加入别问我正确性我不会证

我们先把所有的区间按左端点排个序顺便把互相包含的区间去掉(毕竟互相包含的时候短的肯定比长的优),然后把所有已经被选的区间加入一棵set,然后在里面查找它左右两边的区间\([l1,r1]\)和\([l2,r2]\),那么如果选了这个区间就会影响\([l1+1,r2-1]\),设\(s[i][j]\)表示从\(i\)到\(j\)能选多少个区间,那么加入之后不会使答案变差当且仅当

\[s[l1+1][r2-1]==s[l1+1][l-1]+s[r+1][r2-1]+1
\]

然后\(s\)数组可以用倍增求出来,总的复杂度为\(O(nlogn)\)

然而还有个问题有点懵……原题解的代码里去掉互相包含的区间的时候是保留长的区间……然而也能A……不知道是我理解错了还是什么缘故……

//minamoto
#include<bits/stdc++.h>
#define inf 0x3f3f3f3f
#define IT set<node>::iterator
#define fp(i,a,b) for(register int i=a,I=b+1;i<I;++i)
#define fd(i,a,b) for(register int i=a,I=b-1;i>I;--i)
using namespace std;
#define getc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
char buf[1<<21],*p1=buf,*p2=buf;
int read(){
int res,f=1;char ch;
while((ch=getc())>'9'||ch<'0')(ch=='-')&&(f=-1);
for(res=ch-'0';(ch=getc())>='0'&&ch<='9';res=res*10+ch-'0');
return res*f;
}
const int N=2e5+5;
struct node{
int l,r;
inline bool operator <(const node &b)const
{return l==b.l?r>b.r:l<b.l;}
/*
原题解里这里写的是{return r==b.r?l>b.l:r<b.r;}
下面去重的写的是fp(i,1,n)if(t[i].l>t[m].l)t[++m]=t[i];
*/
}a[N],t[N];set<node>s;
int X[N],Y[N],nx[N][30],L[N],R[N],n,m,ans;
int calc(int l,int r){
int x=lower_bound(X+1,X+1+m,l)-X;if(x>m||Y[x]>r)return 0;
int res=1;
fd(i,20,0)if(nx[x][i]&&Y[nx[x][i]]<=r)res+=1<<i,x=nx[x][i];
return res;
}
int main(){
// freopen("testdata.in","r",stdin);
n=read();fp(i,1,n)t[i].l=read(),t[i].r=read(),a[i]=t[i];
sort(t+1,t+1+n),m=0;
fp(i,1,n){
while(m&&t[i].r<=t[m].r)--m;
t[++m]=t[i];
}
fp(i,1,m)X[i]=t[i].l,Y[i]=t[i].r;
for(register int i=1,j=1;i<=m;++i){
while(j<=m&&t[j].l<=t[i].r)++j;
if(j<=m)nx[i][0]=j;
}
fp(j,1,20)fp(i,1,m)nx[i][j]=nx[nx[i][j-1]][j-1];
printf("%d\n",ans=calc(-inf,inf));
s.insert((node){inf,inf}),s.insert((node){-inf,-inf});
fp(i,1,n){
IT x=s.lower_bound(a[i]),y=x;--y;
int l1=y->r,r1=a[i].l,l2=a[i].r,r2=x->l;
if(l1>=r1||l2>=r2)continue;
if(calc(l1+1,r2-1)==calc(l1+1,r1-1)+calc(l2+1,r2-1)+1)
printf("%d ",i),s.insert(a[i]);
}return 0;
}

P3626 [APIO2009]会议中心的更多相关文章

  1. [Luogu P3626] [APIO2009] 会议中心

    题面 传送门:https://www.luogu.org/problemnew/show/P3626 Solution 如果题目只要求求出第一问,那这题显然就是大水题. 但是加上第二问的话...... ...

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

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

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

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

  4. [APIO2009]会议中心

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

  5. BZOJ.1178.[APIO2009]会议中心(贪心 倍增)

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

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

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

  7. BZOJ1178或洛谷3626 [APIO2009]会议中心

    BZOJ原题链接 洛谷原题链接 第一个问题是经典的最多不相交区间问题,用贪心即可解决. 主要问题是第二个,求最小字典序的方案. 我们可以尝试从\(1\to n\)扫一遍所有区间,按顺序对每一个不会使答 ...

  8. Luogu 3626 [APIO2009]会议中心

    很优美的解法. 推荐大佬博客 如果没有保证字典序最小这一个要求,这题就是一个水题了,但是要保证字典序最小,然后我就不会了…… 如果一条线段能放入一个区间$[l', r']$并且不影响最优答案,那么对于 ...

  9. 【BZOJ】【1178】【APIO2009】convention会议中心

    贪心 如果不考虑字典序的话,直接按右端点排序,能选就选,就可以算出ans…… 但是要算一个字典序最小的解就比较蛋疼了= = Orz了zyf的题解 就是按字典序从小到大依次枚举,在不改变答案的情况下,能 ...

随机推荐

  1. POJ1276 Cash Machine

    Time Limit: 1000MS   Memory Limit: 10000KB   64bit IO Format: %lld & %llu Description A Bank pla ...

  2. idea使用之maven中央仓库索引更新

    接着上篇,上篇是更新本地已有的索引,这样在编写pom文件的时候,可以自动提示,但如果我们能够把整个中央仓库的索引更新下来,那不是更方便啦. 打开settings-->Build,Executio ...

  3. 【中文排序】mysql order by 中文排序

    1. 在MySQL中,我们经常会对一个字段进行排序查询,但进行中文排序和查找的时候,对汉字的排序和查找结果往往都是错误的. 这种情况在MySQL的很多版本中都存在. 如果这个问题不解决,那么MySQL ...

  4. 配置-XX:+HeapDumpOnOutOfMemoryError 对于OOM错误自动输出dump文件

    配置-XX:+HeapDumpOnOutOfMemoryError 对于OOM错误自动输出dump文件 学习了:http://blog.csdn.net/stevendbaguo/article/de ...

  5. android动态控制组件的位置、大小和新的动画

    一.动态设置组件的位置 当中view是须要改变位置的控件,top是须要设制的位置: private static void setLayoutX(View view,int top)  { //克隆v ...

  6. luajit利用ffi结合C语言实现面向对象的封装库

    luajit中.利用ffi能够嵌入C.眼下luajit的最新版是2.0.4,在这之前的版本号我还不清楚这个扩展库详细怎么样,只是在2.04中,真的非常爽.  既然是嵌入C代码.那么要说让lua支持 ...

  7. Lighttpd 插件mod_h264 streaming (mp4)安装

    1. 对于安装lighttpd须要支持mp4伪流媒体格式,建议不要到官方下载lighttpd安装文件,到 插件H264 Streaming Module官网,下载已经整合了的安装包 http://h2 ...

  8. Wicket实战(一)概述

    今天给大家介绍一个很好的东西.一个被称作Java平台上的ASP.NET--Wicket. 什么是Wicket 什么是Wicket,假设你用谷歌或其它搜索引擎搜索一番之后,就会发现wicket是Java ...

  9. 2015/12/29 Java语言概述 操作中注意事项

    java语言概述 ①版本分类:JavaSE 标准版 桌面开发                 JavaEE 企业版 网络开发                 JavaME 移动版 嵌入式开发(塞班系统 ...

  10. ssh服务常见问题及其解决办法

    1 统一解决办法 执行sshd -t,这样就可以指出是哪里出问题了. 所有的服务都应该有这个测试选项,否则出错了都不知道在哪里出的问题. 2 root用户登录,密码是对的,但是报“Permission ...