会议中心

思路

这一题的正解是倍增的,但是由于我太蒟蒻了,所以我选了一个不算正解但是有可以拿满分的题目学习

思路和我考场上其实差不多,只是我无法实现....

下面我先来介绍几个数组的用途

1.s,s数组代表的是枚举的i时,包括i区间在内最多有多少个区间

2.p数组,p[i]记录的是在这一区间和这一区间之前,字典序最小的并且满足使区间数最多的区间的位置

3.而pr数组代表的是由哪一个区间+1转移过来的...(大概是这个意思,表达能力不是很好)

然后我们就要讨论情况了

第一种情况是我们对这个区间有更新,就是说是由这个区间加上它前面的区间可以构成一个更大的区间总和

第二种情况就是守老本,看上一层得到的解是否依然更加优秀

所以我们就要有不同的处理方式

m是在该区间之前,满足其r最接近当前区间的l的,然后我们就看

如果:

s[m]+1>s[i-1] ,我们就要更新,即p[i]=i,s[i]=s[m]+1;

s[m]+1<s[i-1],我们就守老本,即p[i]=p[i-1],s[i]=s[i-1];

但是还有一种情况,就是2者相等,这是我们就要有选择了,因为我们既然选择了这个,后面的方案就是确定了的,但是前面的方案我们就要选择更优的,即字典序更小的

那就是判断了,具体见代码

tips:是由那个点转移过来的我们要记录好,到时候判断更优的时候需要

二分就不要问我了,我也有点小蒙

 #include<bits/stdc++.h>
#define ll long long
#define FOR(i,a,b) for(register int i=a;i<=b;i++)
#define ROF(i,a,b) for(register int i=a;i>=b;i--)
using namespace std;
const int N=+;
int n;
int p[N],pr[N],s[N];
int q[N];
struct s1
{
int l,r,id;
}a[N];
bool cmp(s1 x,s1 y)
{
return x.r<y.r;
}
int scan()
{
int as=,f=;
char c=getchar();
while(c>''||c<''){if(c=='-') f=-;c=getchar();}
while(c>=''&&c<=''){as=(as<<)+(as<<)+c-'';c=getchar();}
return as*f;
}
int main()
{
n=scan();
FOR(i,,n)
{
a[i].l=scan();a[i].r=scan();a[i].id=i;
}
sort(a+,a+n+,cmp);
FOR(i,,n)
{
int l=,r=i-,m=;
while(l<=r)
{
int mid=(l+r)>>;
if(a[mid].r<a[i].l) m=mid,l=mid+;
else r=mid-;
}
//现在我们找到了最近的一个区间
int f=s[m]+;
pr[i]=p[m];
if(f>s[i-]) s[i]=f,p[i]=i;
else if(s[i-]>f) s[i]=s[i-],p[i]=p[i-];
else
{
int p1=p[i-],p2=i,min1=1e9,min2=1e9;
while(pr[p1]!=pr[p2])
{
if(a[p1].id<min1) min1=a[p1].id;
if(a[p2].id<min2) min2=a[p2].id;
p1=pr[p1];p2=pr[p2];
}
if(a[p1].id<min1)min1=a[p1].id;//处理"祖先"相同但当前结点不同
if(a[p2].id<min2) min2=a[p2].id;
if(min1<min2) s[i]=s[i-],p[i]=p[i-];
else s[i]=f,p[i]=i,pr[i]=p[m];
}
}
int now=p[n],top=;
cout<<s[n]<<endl;
while(now)
{
q[++top]=a[now].id;now=pr[now];
}
sort(q+,q+top+);
FOR(i,,top) cout<<q[i]<<" ";
return ;
}

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

  1. [APIO2009]会议中心

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

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

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

  3. 1178: [Apio2009]CONVENTION会议中心

    1178: [Apio2009]CONVENTION会议中心 https://lydsy.com/JudgeOnline/problem.php?id=1178 分析: set+倍增. 首先把所有有包 ...

  4. bzoj1178 [Apio2009]CONVENTION会议中心 区间dp+贪心

    [Apio2009]CONVENTION会议中心 Time Limit: 15 Sec  Memory Limit: 162 MBSubmit: 1130  Solved: 444[Submit][S ...

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

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

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

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

  7. BZOJ1178 [Apio2009]CONVENTION会议中心

    本文作者:ljh2000作者博客:http://www.cnblogs.com/ljh2000-jump/转载请注明出处,侵权必究,保留最终解释权! Description Siruseri政府建造了 ...

  8. 【BZOJ-1178】CONVENTION会议中心 倍增 + set (神思路好题!)

    1178: [Apio2009]CONVENTION会议中心 Time Limit: 15 Sec  Memory Limit: 162 MBSubmit: 812  Solved: 323[Subm ...

  9. Java实现 蓝桥杯VIP 算法训练 会议中心

    算法训练 会议中心 时间限制:2.0s 内存限制:512.0MB 会议中心 Siruseri政府建造了一座新的会议中心.许多公司对租借会议中心的会堂很感兴趣,他们希望能够在里面举行会议. 对于一个客户 ...

随机推荐

  1. jmeter设置全局变量的方法

    需求: 同一个线程组内有两个http请求A.B,A请求的后置处理器中存储的有值,B请求中添加用户变量Va先要引用该值,然后B请求的前置处理器再引用用户变量va. 第一种方式: 1.A请求后置处理添加如 ...

  2. jenkins手动安装插件

    插件下载地址: 搜索:https://plugins.jenkins.io/ 列表:https://updates.jenkins-ci.org/download/plugins/ 打开jenkins ...

  3. iOS笔记058 - IOS之多线程

    IOS开发中多线程 主线程 一个iOS程序运行后,默认会开启1条线程,称为"主线程"或"UI线程" 作用 显示和刷新界面 处理UI事件(点击.滚动.拖拽等) 注 ...

  4. 签名APK后仍然出现INSTALL_PARSE_FAILED_NO_CERTIFICATES的解决方案

    修改apk里的dex并且修复后重新打包进apk里,使用signapk.jar签名后安装仍然出现INSTALL_PARSE_FAILED_NO_CERTIFICATES,搜了很久,使用了多种方法签名仍然 ...

  5. jmeter的基本使用过程

    jmeter的基本使用过程 接下来几周,我将通过视频的方式,录制下来jmeter的基本用法,方便大家参考学习 可能导图会随时调整

  6. parity的使用

    parity --chain dev --port 8045 ps aux | grep "parity" ps -elf | grep "pari"

  7. POJ 3177 Redundant Paths & POJ 3352 Road Construction(双连通分量)

    Description In order to get from one of the F (1 <= F <= 5,000) grazing fields (which are numb ...

  8. chromium源码阅读--V8 Embbeding

    V8是google提供高性能JavaScript解释器,嵌入在chromium里执行JavaScript代码. V8本身是C++实现的,所有嵌入本身毫无压力,一起编译即可,不过作为一个动态语言解释器, ...

  9. Ext.Net中如何获取组件

    我们在编写函数function的时候,常常需要用到页面上的组件.这时候就需要调用组件. 在Ext.net中,调用组件可以用.App.ID.(ID指的是想要调用的组件的ID). 例如: 我写一个函数需要 ...

  10. maven仓库地址

    使用Maven进行开发的时候,比较常见的一个问题就是如何寻找我要的依赖,比如说,我想要使用activeMQ,可是我不知道groupId,artifactId,和合适的version.怎么办呢?本文介绍 ...