【题解】[P3626 APIO2009]会议中心

真的是一道好题!!!刷新了我对倍增浅显的认识。

此题若没有第二份输出一个字典序的方案,就是一道\(sort+\)贪心,但是第二问使得我们要用另外的办法。

考虑到题目的性质,贪心地想,假如我们已经选择了区间\(i\),我们就可以盖将自其变者而观之,则天地曾不能以一瞬;自其不变者而观之,则物与我皆无尽也,而又何羡乎!确定下一个是谁,虽世殊事异,所以兴怀,其致一也,而且不用关心其他的情况,也就是说,下一个选择是确定的!

考虑暴力存下来我是下\(i\)个是谁,空间不够,怎么办?考虑到,我附庸的附庸也是我的附庸下一个的下一个是我的下两个,可以倍增啊!

\(st(i,j)\)表示选择\(i\)后,下\(2^j\)选择是谁。可以先预处理\(k=0\),然后直接倍增的套路把数组处理出来。

那么如何确定答案呢?

我们对于线段建立一个拟阵\((L,E)\),易知对于答案线段集合\(e \in E\)是显然满足遗传性和增广性的,那只还在集族\(E\)中,仍然是独立集,就一定是这个拟阵中极大独立集的一个。那么我们就可以\(O(nlogn+nf(x))\)地确定极大独立集了。

哈哈哈哈哈哈

就是贪心,没有别的。

我们搞个这样的操作:假若加入我这个答案,发现被我影响的所有区间内的总答案没有发生变化,那么我们就加吧。然后按照加入的时间顺序加,就直接可以输出了。

开眼了!

暴露了一个问题,我平衡树一个都不会,必须学一个QAQ

#include<bits/stdc++.h>

using namespace std;typedef long long ll;
#define DRP(t,a,b) for(register int t=(a),edd=(b);t>=edd;--t)
#define RP(t,a,b) for(register int t=(a),edd=(b);t<=edd;++t)
#define ERP(t,a) for(register int t=head[a];t;t=e[t].nx)
#define midd register int mid=(l+r)>>1
#define TMP template < class ccf >
TMP inline ccf qr(ccf b){
register char c=getchar();register int q=1;register ccf x=0;
while(c<48||c>57)q=c==45?-1:q,c=getchar();
while(c>=48&&c<=57)x=x*10+c-48,c=getchar();
return q==-1?-x:x;}
TMP inline ccf Max(ccf a,ccf b){return a<b?b:a;}
TMP inline ccf Min(ccf a,ccf b){return a<b?a:b;}
TMP inline ccf Max(ccf a,ccf b,ccf c){return Max(a,Max(b,c));}
TMP inline ccf Min(ccf a,ccf b,ccf c){return Min(a,Min(b,c));}
TMP inline ccf READ(ccf* _arr,int _n){RP(t,1,_n)_arr[t]=qr((ccf)1);}
//----------------------template&IO--------------------------- const int maxn=2e5+15;
struct DATA{
int l,r;
inline bool operator <(DATA x)const{return r==x.r?l>x.l:r<x.r;}
inline DATA scan(){l=qr(1),r=qr(1);return *this;}
}data[maxn],usd[maxn],orzpsj[maxn];
set < DATA > qaq;
int L[maxn],R[maxn];
int st[maxn][33];
int n,cnt;
const int inf=0x3f3f3f3f;
inline int wk(int l,int r){
register int ret=0,now=lower_bound(L+1,L+1+cnt,l)-L;
if(R[now]>r||now>cnt) return 0;
DRP(t,31,0)if(st[now][t]&&R[st[now][t]]<=r)ret+=1<<t,now=st[now][t];return ret+1;
} inline DATA mk(int l,int r){
DATA ret;
ret.l=l;ret.r=r;
return ret;
} int main(){
#ifndef ONLINE_JUDGE
freopen("interval10.in","r",stdin);
freopen("interval.out","w",stdout);
#endif
n=qr(1);
RP(t,1,n) orzpsj[t]=data[t].scan();
sort(data+1,data+n+1);
RP(t,1,n) if(!cnt||data[t].l>usd[cnt].l) usd[++cnt]=data[t];
RP(t,1,cnt) L[t]=usd[t].l,R[t]=usd[t].r;
for(register int t=1,j=1;t<=cnt;++t){
while(j<=cnt&&usd[j].l<=usd[t].r) ++j;
if(j<=cnt) st[t][0]=j;
}
RP(t,1,31)
RP(i,1,cnt)
st[i][t]=st[st[i][t-1]][t-1];
int ans=wk(-inf,inf);
cout<<ans<<endl;
qaq.insert(mk(inf,inf));
qaq.insert(mk(-inf,-inf));
set< DATA >::iterator x,y;
int l1,r1,l2,r2;
RP(t,1,n) data[t]=orzpsj[t];
RP(t,1,n){
y=x=qaq.lower_bound(data[t]);y--;
l1=y->r,r1=data[t].l,l2=data[t].r,r2=x->l;
if(l1>=r1||l2>=r2) continue;
if(wk(l1+1,r2-1)==wk(l1+1,r1-1)+wk(l2+1,r2-1+1)+1){
cout<<t<<' ';qaq.insert(data[t]);
}
}
return 0;
}

【题解】[APIO2009]会议中心的更多相关文章

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

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

  2. [APIO2009]会议中心

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

  3. P3626 [APIO2009]会议中心

    传送门 好迷的思路-- 首先,如果只有第一问就是个贪心,排个序就行了 对于第二问,我们考虑这样的一种构造方式,每一次都判断加入一个区间是否会使答案变差,如果不会的话就将他加入别问我正确性我不会证 我们 ...

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

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

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

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

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

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

  7. Luogu 3626 [APIO2009]会议中心

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

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

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

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

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

随机推荐

  1. Android与javaScript的交互

    WebView与js的交互包含两方面,一是在html中通过js调用java代码:二是在安卓java代码中调用js. 一.html中通过js调用java代码 js中调用java代码其实就记住一点,Web ...

  2. 网上常用免费webservice_查询(网络复制)

    MP3在线搜索服务 地址:http://www.wopos.com/webservice/song.asmx 介绍: 使用: getMusicList()方法搜索MP3/WMA等音乐文件 多功能条形码 ...

  3. 算法之美--1.蒙特卡洛方法计算pi

    基本思想: 利用圆与其外接正方形面积之比为pi/4的关系,通过产生大量均匀分布的二维点,计算落在单位圆和单位正方形的数量之比再乘以4便得到pi的近似值.样本点越多,计算出的数据将会越接近真识的pi(前 ...

  4. Android - EditText 注意(缺少字符)

    EditText 注意(缺少字符) 本文地址:http://blog.csdn.net/caroline_wendy EditText使用监听(Listener)addTextChangedListe ...

  5. GIS可视化——聚散图

    一.简介 随着计算机的发展,浏览器的不断进步与完善,现今大部分浏览渲染效率有了很大的改善, 但是由于浏览器厂商的不同,浏览器种类繁多,性能不一,并且很多用户还使用着不少老的浏览, 那些如IE6.7等的 ...

  6. linux中判断符号[]注意事项

    1.中括号[]内的每个组件都需要有空格键来分割: 2.在中括号内的变量,最好都一双引号括号起来: 3.在中括号内的常量,最好都以单引号或双引号括号起来.

  7. android(cm11)状态栏源代码分析(一)

    (一):写在前面 近期因为工作须要,须要了解CM11中的有关于StatusBar相关的内容.总的来说,刚開始阅读其源代码的时候,是有点困难,只是通过构建相关代码的脑图和流程图,几天下来.我已经对其源代 ...

  8. 【秀优越(xie e)】原来出题也能够这么恶心。

    通过邪恶的数据范围和数据限制居然能够把一道传统题出成题答2333. 诶毕竟内部互測,题目就不往上贴了. 特殊限制 - - - 题目作废.输出M行"Orz  PoPoQQQ" - M ...

  9. vue2.X slot 分发内容

    1.概述: 简单来说,假如父组件需要在子组件内放一些DOM,那么这些DOM是显示.不显示.在哪个地方显示.如何显示,就是slot分发负责的活. 2.默认情况下 父组件在子组件内套的内容,是不显示的. ...

  10. Android开发第一讲之目录结构和程序的执行流程

    1.如何在eclipse当中,修改字体 下面的这种办法,可以更改xml的字体 窗口--首选项--常规--外观--颜色和字体--基本--文本字体--编辑Window --> Preferences ...