1178: [Apio2009]CONVENTION会议中心

Time Limit: 15 Sec  Memory Limit: 162 MB
Submit: 812  Solved: 323
[Submit][Status][Discuss]

Description

Siruseri政府建造了一座新的会议中心。许多公司对租借会议中心的会堂很感兴趣,他们希望能够在里面举行会议。 对于一个客户而言,仅当在开会时能够独自占用整个会堂,他才会租借会堂。会议中心的销售主管认为:最好的策略应该是将会堂租借给尽可能多的客户。显然,有可能存在不止一种满足要求的策略。 例如下面的例子。总共有4个公司。他们对租借会堂发出了请求,并提出了他们所需占用会堂的起止日期(如下表所示)。 开始日期 结束日期 公司1 4 9 公司2 9 11 公司3 13 19 公司4 10 17 上例中,最多将会堂租借给两家公司。租借策略分别是租给公司1和公司3,或是公司2和公司3,也可以是公司1和公司4。注意会议中心一天最多租借给一个公司,所以公司1和公司2不能同时租借会议中心,因为他们在第九天重合了。 销售主管为了公平起见,决定按照如下的程序来确定选择何种租借策略:首先,将租借给客户数量最多的策略作为候选,将所有的公司按照他们发出请求的顺序编号。对于候选策略,将策略中的每家公司的编号按升序排列。最后,选出其中字典序最小1的候选策略作为最终的策略。 例中,会堂最终将被租借给公司1和公司3:3个候选策略是{(1,3),(2,3),(1,4)}。而在字典序中(1,3)<(1,4)<(2,3)。 你的任务是帮助销售主管确定应该将会堂租借给哪些公司。

Input

输入的第一行有一个整数N,表示发出租借会堂申请的公司的个数。第2到第N+1行每行有2个整数。第i+1行的整数表示第i家公司申请租借的起始和终止日期。对于每个公司的申请,起始日期为不小于1的整数,终止日期为不大于10^9的整数。N≤200000

Output

输出的第一行应有一个整数M,表示最多可以租借给多少家公司。第二行应列出M个数,表示最终将会堂租借给哪些公司。

Sample Input

4
4 9
9 11
13 19
10 17

Sample Output

2
1 3

HINT

修复数据bug,并新加数据一组By NanoApe 2016.5.11

修复后数据:JudgeOnline/upload/201605/dd.rar

Source

Solution

思路非常神

首先我们如果只要求数目最多,显然可以贪心,即线段覆盖

字典序最小就很麻烦了

方法还是贪心,按照读入的顺序,判断,如果使当前满足,能够达到最优,那么就选当前

问题是如何加速判断的过程

$f[i][j]$表示,以$i$时间开始,选$2^{j}$条线段后,右端点最近在哪

这个信息显然是可以合并的,那么倍增解决

判断的时候,用数据结构维护一下就可以,比如用set查询前驱后继

Code

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<set>
using namespace std;
int read()
{
int x=,f=; char ch=getchar();
while (ch<'' || ch>'') {if (ch=='-') f=-; ch=getchar();}
while (ch>='' && ch<='') {x=x*+ch-''; ch=getchar();}
return x*f;
}
#define MAXN 200010
#define INF 0x3f3f3f3f
int N;
struct CompanyNode{int s,t,id;}c[MAXN],tmp[MAXN],b[MAXN];
bool cmp1(CompanyNode A,CompanyNode B) {return A.s==B.s? A.t>B.t : A.s<B.s;}
bool cmp2(CompanyNode A,CompanyNode B) {return A.id<B.id;}
struct SetNode
{
int x,f;
SetNode (int x,int f) : x(x),f(f) {}
bool operator < (const SetNode & A) const
{return x<A.x;}
};
set<SetNode>st;
set<SetNode>::iterator lst,rst;
int f[MAXN<<][];
int Cal(int l,int r)
{
int re=;
for (int i=; i>=; i--)
if (f[l][i]<=r) l=f[l][i]+,re+=<<i; //一定要+1
return re;
}
int ls[MAXN<<],tp,top;
int main()
{
//freopen("data.in","r",stdin); freopen("data.out","w",stdout);
N=read();
for (int i=; i<=N; i++) ls[++tp]=c[i].s=read(),ls[++tp]=c[i].t=read(),c[i].id=i;
sort(ls+,ls+tp+);
top=unique(ls+,ls+tp+)-ls-;
for (int i=; i<=N; i++)
c[i].s=lower_bound(ls+,ls+top+,c[i].s)-ls,c[i].t=lower_bound(ls+,ls+top+,c[i].t)-ls;
sort(c+,c+N+,cmp1);
int last=INF; tp=;
for (int i=N; i>=; i--) if (c[i].t<last) tmp[++tp]=c[i],last=c[i].t;
reverse(tmp+,tmp+tp+);
// for (int i=1; i<=tp; i++) printf("%d %d %d\n",tmp[i].s,tmp[i].t,tmp[i].id);
memset(f,0x3f,sizeof(f));
// printf("%d %d\n",f[1],INF);
for (int i=top,j=tp; i>=; i--)
{
f[i][]=f[i+][];
if (tmp[j].s==i) f[i][]=min(f[i][],tmp[j].t);
for (int k=; k<=; k++)
if (f[i][k-]!=INF)
f[i][k]=f[f[i][k-]+][k-];
while (tmp[j].s==i) j--;
}
// for (int i=1; i<=N; i++) printf("%d %d %d\n",c[i].id,c[i].s,c[i].t);
printf("%d\n",Cal(,top));
sort(c+,c+N+,cmp2);
st.insert(SetNode(,-)); st.insert(SetNode(top+,));
int cnt=;
for (int i=; i<=N; i++)
{
SetNode ls=SetNode(c[i].s,),rs=SetNode(c[i].t,-);
lst=st.lower_bound(ls); rst=st.upper_bound(rs);
if (lst!=rst || (*rst).f==-) continue;
lst--;
int L=(*lst).x+,R=(*rst).x-;
if (Cal(L,c[i].s-)+Cal(c[i].t+,R)+==Cal(L,R))
{
st.insert(ls),st.insert(rs);
cnt++; if (cnt==) printf("%d",c[i].id); else printf(" %d",c[i].id);
}
}
puts("");
return ;
}

【BZOJ-1178】CONVENTION会议中心 倍增 + set (神思路好题!)的更多相关文章

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

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

  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. BZOJ1178 [Apio2009]CONVENTION会议中心

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

  6. 【BZOJ 1178】【APIO 2009】CONVENTION会议中心

    http://www.lydsy.com/JudgeOnline/problem.php?id=1178 这道题想了好久没想明白,倍增数组通过看题解很快就明白了,但是一小段区间内应有的最多线段数一直不 ...

  7. bzoj 1178 [Apio2009]CONVENTION会议中心

    这题好难啊! 我好菜啊! 思路:对于最多线段不相交, 我们可以按左端点sort之后,贪心取. 但是这个题要求选取的线段排序之后序号的字典序最小. 那么我们如果按序号贪心地从大往小往里放, 那么对于第k ...

  8. bzoj 1178: [Apio2009]CONVENTION会议中心(少见做法掉落!)【贪心+二分】

    数组若干+手动二分一个的算法,bzoj rank8 ===============================废话分割线=================================== 我我 ...

  9. 【bzoj1178】 Apio2009—CONVENTION会议中心

    http://www.lydsy.com/JudgeOnline/problem.php?id=1178 (题目链接) 题意 给出n个区间,问在区间两两不相交的情况下最多能选出多少区间,并输出字典序最 ...

随机推荐

  1. Apache配置中的ProxyPass 和 ProxyPassReverse

    apache中的mod_proxy模块用于url的转发,即具有代理的功能.应用此功能,可以很方便的实现同tomcat等应用服务器的整合,甚者可以很方便的实现web集群的功能. 例如使用apache作为 ...

  2. Windows 8 开发系列汇总

    Windows 8 应用开发 Windows 8 应用开发 - 异步调用 Windows 8 应用开发 - 本地数据存储 Windows 8 应用开发 - 挂起与恢复 Windows 8 应用开发 - ...

  3. 阿里云修改默认的ssh端口

    Linux服务器的ssh服务支持远程访问服务器,默认的ssh端口号是22.为了安全起见,很多用户会将端口号由22改为其他的端口号.  如果遇到修改端口号并重启ssh服务后,新的端口号不生效,请参考以下 ...

  4. linux addr2line 定位so库崩溃位置

    在Linux下写C/C++程序的程序员,时常与Core Dump相见.在内存越界访问,收到不能处理的信号,除零等错误出现时,我们精心或不精心写就的程序就直接一命呜呼了,Core Dump是Linux仁 ...

  5. php数组函数,字符串,linux命令

    1>> Linux常用命令一. 文件目录操作命令1. ls命令    命令格式:ls [选项] [目录名]    命令功能:列出目标目录中所有的子目录和文件.2. 命令格式:cd [目录名 ...

  6. TinyFrame再续篇:整合Spring AOP实现日志拦截

    上一篇中主要讲解了如何使用Spring IOC实现依赖注入的.但是操作的时候,有个很明显的问题没有解决,就是日志记录问题.如果手动添加,上百个上千个操作,每个操作都要写一遍WriteLog方法,工作量 ...

  7. Qt学习笔记 TableWidget使用说明和增删改操作的实现

    看一下效果很简单的一个小功能 先说分部讲一下过程 再给出详细代码 添加数据 MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ...

  8. WPF EventSetter Handler Command

    最近做一个工具,突然发现ListBox和ListView等列表控件的MouseDoubleClick事件有时候是获取不到当前双击的行对象数据的,比如这样写: <ListBox Grid.Row= ...

  9. STM32-外部中断,没有硬件干扰就是快乐

    一:触发方式 STM32 的外部中断是通过边沿来触发的,不支持电平触发: 二:外部中断分组 STM32 的每一个GPIO都能配置成一个外部中断触发源,STM32 通过根据引脚的序号不同将众多中断触发源 ...

  10. .net 估计要死在你手里了

    最近不太爽,想换工作,上这些知名的招聘网站,一搜 .net 心凉了一截,很少有大公司用.net,工资也不是很高. 不用我多说什么,想必很多人应该有类似经历,只是打了牙往肚子里咽. 来两副图: 最近用滴 ...