BZOJ1178或洛谷3626 [APIO2009]会议中心
BZOJ原题链接
洛谷原题链接
第一个问题是经典的最多不相交区间问题,用贪心即可解决。
主要问题是第二个,求最小字典序的方案。
我们可以尝试从\(1\to n\)扫一遍所有区间,按顺序对每一个不会使答案变差的区间都尝试着去填,这样就可以保证方案的字典序最小。
考虑如果快速判断该区间是否能成为最优解,开头先按右端点从小到大排序,左端点从大到小排序,再去除有包含关系的区间,这样使得讨论更为简单。
设待插入的区间为\([r,l]\),该区间左边的第一个已插入的区间的右端点为\(L\),右边的第一个已插入的区间的左端点为\(R\),\(S[i][j]\)表示\([i,j]\)间有多少已插入的区间。
则该区间能插入必须满足\(S[L + 1][R - 1] = S[L + 1][r - 1] + S[l + 1][R - 1] + 1\)。
对于快速计算\(S\),我们可以采用倍增的思想,设\(ne[x][i]\)表示第\(x\)个区间后选择\(2^i\)个区间的最后一个区间下标,可以使用倍增在\(nlogn\)内预处理出来。
维护已插入区间可以使用\(C++\ STL\ set\)。
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<set>
using namespace std;
const int N = 2e5 + 10;
const int M = 18;
struct dd{
int x, y;
bool operator < (const dd &b) const
{
if (!(y ^ b.y))
return x > b.x;
return y < b.y;
}
};
dd a[N], b[N];
int X[N], Y[N], ne[N][M], m, gn;
set<dd>S;
inline int re()
{
int x = 0;
char c = getchar();
bool p = 0;
for (; c < '0' || c > '9'; c = getchar())
p |= c == '-';
for (; c >= '0' && c <= '9'; c = getchar())
x = x * 10 + c - '0';
return p ? -x : x;
}
inline int lowbod(int x)
{
int l = 1, r = m, mid, an = m + 1;
while (l <= r)
{
mid = (l + r) >> 1;
if (X[mid] >= x)
{
an = mid;
r = mid - 1;
}
else
l = mid + 1;
}
return an;
}
inline int calc(int l, int r)
{
int x = lowbod(l);
if (x > m || Y[x] > r)
return 0;
int s = 1;
for (int i = gn; ~i; i--)
if (ne[x][i] && Y[ne[x][i]] <= r)
{
s += 1 << i;
x = ne[x][i];
}
return s;
}
int main()
{
int i, j, n, l, r, L, R;
n = re();
for (i = 1; i <= n; i++)
{
a[i].x = re();
a[i].y = re();
b[i] = a[i];
}
sort(b + 1, b + n + 1);
for (i = 1; i <= n; i++)
if (b[i].x > b[m].x || !m)
b[++m] = b[i];
for (i = 1; i <= m; i++)
{
X[i] = b[i].x;
Y[i] = b[i].y;
}
for (i = j = 1; i <= m; i++)
{
for (; j <= m && b[j].x <= b[i].y; j++);
if (j <= m)
ne[i][0] = j;
}
gn = log2(m);
for (j = 1; j <= gn; j++)
for (i = 1; i <= m; i++)
ne[i][j] = ne[ne[i][j - 1]][j - 1];
printf("%d\n", calc(-2e9, 2e9));
S.insert((dd){-2e9, -2e9});
S.insert((dd){2e9, 2e9});
for (i = 1; i <= n; i++)
{
set<dd>::iterator x = S.lower_bound(a[i]), y;
--(y = x);
L = y -> y;
r = a[i].x;
l = a[i].y;
R = x -> x;
if (L >= r || l >= R)
continue;
if (!(calc(L + 1, R - 1) ^ (calc(L + 1, r - 1) + calc(l + 1, R - 1) + 1)))
{
printf("%d ", i);
S.insert(a[i]);
}
}
return 0;
}
BZOJ1178或洛谷3626 [APIO2009]会议中心的更多相关文章
- Luogu 3626 [APIO2009]会议中心
很优美的解法. 推荐大佬博客 如果没有保证字典序最小这一个要求,这题就是一个水题了,但是要保证字典序最小,然后我就不会了…… 如果一条线段能放入一个区间$[l', r']$并且不影响最优答案,那么对于 ...
- [APIO2009]会议中心(贪心)
P3626 [APIO2009]会议中心 题目描述 Siruseri 政府建造了一座新的会议中心.许多公司对租借会议中心的会堂很 感兴趣,他们希望能够在里面举行会议. 对于一个客户而言,仅当在开会时能 ...
- [APIO2009]会议中心
[APIO2009]会议中心 题目大意: 原网址与样例戳我! 给定n个区间,询问以下问题: 1.最多能够选择多少个不相交的区间? 2.在第一问的基础上,输出字典序最小的方案. 数据范围:\(n \le ...
- 【题解】[APIO2009]会议中心
[题解][P3626 APIO2009]会议中心 真的是一道好题!!!刷新了我对倍增浅显的认识. 此题若没有第二份输出一个字典序的方案,就是一道\(sort+\)贪心,但是第二问使得我们要用另外的办法 ...
- BZOJ.1178.[APIO2009]会议中心(贪心 倍增)
BZOJ 洛谷 \(Description\) 给定\(n\)个区间\([L_i,R_i]\),要选出尽量多的区间,并满足它们互不相交.求最多能选出多少个的区间以及字典序最小的方案. \(n\leq2 ...
- BZOJ1179或洛谷3672 [APIO2009]抢掠计划
BZOJ原题链接 洛谷原题链接 在一个强连通分量里的\(ATM\)机显然都可被抢,所以先用\(tarjan\)找强连通分量并缩点,在缩点的后的\(DAG\)上跑最长路,然后扫一遍酒吧记录答案即可. # ...
- 【题解】洛谷P3627 [APIO2009]抢掠计划(缩点+SPFA)
洛谷P3627:https://www.luogu.org/problemnew/show/P3627 思路 由于有强连通分量 所以我们可以想到先把整个图缩点 缩点完之后再建一次图 把点权改为边权 并 ...
- BZOJ1178 APIO2009 会议中心 贪心、倍增
传送门 只有第一问就比较水了 每一次贪心地选择当前可以选择的所有线段中右端点最短的,排序之后扫一遍即可. 考虑第二问.按照编号从小到大考虑每一条线段是否能够被加入.假设当前选了一个区间集合\(T\), ...
- 洛谷P3625 - [APIO2009]采油区域
Portal Description 给出一个\(n\times m(n,m\leq1500)\)的矩阵,从中选出\(3\)个互不相交的\(k\times k\)方阵,使得被选出的数的和最大. Sol ...
随机推荐
- 关于ros将opencv版本固定“写死”的一些想法
今天主要工作是将ros和zed结合起来,但是发现自己安装了opencv3.1,ros indigo安装的是opencv2.4.8,这就麻烦了,zed支持的是opencv3.1.一开始使用slam2时, ...
- Linux安装face_recgnition
Ubuntu 3:apt-get install python3.6-dev 4:pip3 install face_recgnition 5: pip3 install opencv-python ...
- 文字在线转图片二维码的公用API接口
在线生成网址二维码的API接口: 1.百度网盘(可使用https) http://pan.baidu.com/share/qrcode?w=150&h=150&url=ht ...
- 移动端web页面滚动不流畅,卡顿闪烁解决方案
移动端web页面滚动不流畅,卡顿闪烁解决方案 1.ios端的-webkit-overflow-scrolling属性可控制页面滚动效果,设置如下实现惯性滚动和弹性效果: -webkit-overf ...
- R各种数据类型的转换
1.列表转化为数据框 df <- data.frame(matrix(unlist(列表), nrow=132, byrow=T),stringsAsFactors=FALSE)
- spring boot 代理(not eligible for auto-proxying)
spring 事务机制网上的案例很多,关于事务 不能回滚也有很多的类型,不同的问题有不同的处理方案,本篇博客主要介绍两种事务不能回滚的问题解决方案: 问题一: 在同一个对象中有两个方法,分别未方 ...
- msf客户端渗透(十):社会工程学
启动社会工程学攻击组件 生成二维码攻击模块 输入你想生成二维码的url,这里做演示用www.baidu.com 二维码生成后,在这个路径下 生成u盘,DVD的多媒体攻击载荷 通过修改autorun.i ...
- Pandas文本操作之读取操作
读写文本格式的数据 pandas中的解析函数 函数 说明 read_csv 从文件.url.文件型对象中加载带分隔符的数据,默认分隔符为逗号 read_table 从文件.url.文件型对象中加载带分 ...
- cdh 5.13 centos6.9安装
1.所有节点准备工作 1).关闭防火墙 2).关闭selinux 并重启系统 3).建立NTP服务器,所有数据节点每天定时同步时间. 主节点在ntp.conf中增加 restrict 192.168. ...
- 变态跳台阶(python)
题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级.求该青蛙跳上一个n级的台阶总共有多少种跳法. # -*- coding:utf-8 -*- class Solution: ...