会议中心

思路

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

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

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

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. Java检测端口的占用情况

    突然间想到这个问题,在网上搜了一下 http://blog.csdn.net/danieluk/article/details/18518175 网上有很多文章都是用上面那个方法来解决这个问题的,总感 ...

  2. 《python核心编程第二版》第1章练习

    1–1. 安装 Python.请检查 Python 是否已经安装到你的系统上,如果没有,请下载并 安装它 略 1–2.  执行 Python.有多少种运行 Python 的不同方法?你喜欢哪一种?为什 ...

  3. C 计算金额

    #include <stdio.h> int main(int argc, char **argv) { \\定义两个变量 a金额 z跟票面 int a=0; int z=0;\\ 输入金 ...

  4. Hadoop伪分布式集群

    一.HDFS伪分布式环境搭建 Hadoop分布式文件系统(HDFS)被设计成适合运行在通用硬件(commodity hardware)上的分布式文件系统.它和现有的分布式文件系统有很多共同点.但同时, ...

  5. 官方文档 恢复备份指南四 Starting and Interacting with the RMAN Client

    本章讲: Starting and Exiting RMAN Specifying the Location of RMAN Output                                ...

  6. DFS(3)——poj1321棋盘问题

    一.题目回顾 题目链接:棋盘问题 Description 在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别.要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于 ...

  7. import方法引入模块详解

    在python用import或者from...import或者from...import...as...来导入相应的模块,作用和使用方法与C语言的include头文件类似.其实就是引入某些成熟的函数库 ...

  8. 使用gradle打包时将依赖也合并入jar包

    有些情形需要将项目依赖的jar包也合并入自己项目的jar包内,出来的这个jar我们称它为fat-jar.我所使用的方法需要用到shadow插件: 下面例子展示将mybatis打入我的jar包,并将my ...

  9. windows服务那些事

    前一段时间由于项目需求,写了一个windows服务.下面总结如下: windows服务其实就是一些后台程序,和其他程序的主要区别是它运行于系统后台.微软公司为了方便我们自己定制我们的服务,提供了很多借 ...

  10. 大数据Hadoop-1

    大数据Hadoop学习之搭建hadoop平台(2.2)   关于大数据,一看就懂,一懂就懵. 一.概述 本文介绍如何搭建hadoop分布式集群环境,前面文章已经介绍了如何搭建hadoop单机环境和伪分 ...