会议中心

思路

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

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

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

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---解析XML文件,通过反射动态将XML内容封装到一个类中

    本博客讲的XML解析,使用的是dom4j. 首先建立一个maven项目,在dom.xml中引入相应的dom4j的版本.作者下载的是热度很高的1.6.1版本.maven的使用在这里不做详细讲解. 引入成 ...

  2. gitbash避免每次push都输入密码

    gitbash每次提交都要输密码真有点头疼,所以就: 1 创建验证文件:touch  .git-credentials(windows) 2 编辑验证文件:vim  .git-credentials ...

  3. Unity动态换装之Spine换装

    注:转载请注明转载,并附原链接 http://www.cnblogs.com/liaoguipeng/p/5867510.html 燕双飞情侣 一.动态换装原理 换装,无非就是对模型的网格,或者贴图进 ...

  4. linux ----- Vim进入和退出命令

    Vim进入和退出命令     本来不想写任何关于vim的文章的,无奈我今天又忘记怎么退出vim了,常用命令是ESC,然后:wq(保存并退出),:q!(不保存并强制退出),i进入vim模式.另外还有其它 ...

  5. python程序设计——基本语言特性

    参考<Python程序设计(第2版)> 清华大学出版社 董付国 ##### 除特殊说明外,以下代码示例,均为python 3.6版本 ##### 一.Python语言特性 1.python ...

  6. JVM 什么时候会触发FGC

    1:System.gc(); 2:老年代满了 没啥好说的从年轻代去往老年代的 3:JDK7或JDK6中永久区满了 得看是否还会有分配,如果没有就不会进行FGC,不过CMS GC下会看到不停地CMS G ...

  7. Camera2与TextureView使用

    package com.intsig.bcrsdk.demo.Activity; import android.annotation.TargetApi; import android.app.Act ...

  8. MySQL初始4--去重

    更新表中的字段: update 表名 set 字段=新值,… where 条件: UPDATE语法可以用新值更新原有表行中的各列.SET子句指示要修改哪些列和要给予哪些值.WHERE子句指定应更新哪些 ...

  9. json.dumps错误:'utf8' codec can't decode byte解决方案

    一次在使用json.dumps()过程中,出现错误提示: ERROR:"UnicodeDecodeError: 'utf8' codec can't decode byte 0xe1 in ...

  10. 有关于PHP的基础知识

    (1) l  长字符串表示,必须放在“<<<heredoc”和 “heredoc;”之间.主要是<<<,其次是也可以不使用heredoc. l  “<< ...