bzoj5102 [POI2018]Prawnicy 线段树

$bzoj$跑的太慢了......
我们考虑用线段树来解决这个问题
考虑扫描线
当扫到左端点$i$时,我们把线段$i$加入线段树
同时,对于每个左端点$i$,我们在线段树上二分出最远的$r$满足$r$被覆盖了$k$次以上
复杂度$O(n \log n)$
然后$TLE$了,这一定不是我的锅...
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std; #define ri register int
#define rep(io, st, ed) for(ri io = st; io <= ed; io ++)
#define drep(io, ed, st) for(ri io = ed; io >= st; io --)
extern inline char gc() {
static char RR[], *S = RR + , *T = RR + ;
if(S == T) fread(RR, , , stdin), S = RR;
return *S ++;
}
inline int read() {
int p = ; char c = gc();
while(c > '' || c < '') c = gc();
while(c >= '' && c <= '') p = p * + c - '', c = gc();
return p;
} int wr[], rw;
#define pc(iw) putchar(iw)
inline void write(int x, char c = '\n') {
if(!x) pc('');
if(x < ) x = -x, pc('-');
while(x) wr[++ rw] = x % , x /= ;
while(rw) pc(wr[rw --] + ''); pc(c);
} const int sid = ;
const int tid = ; int nl, nr, ans;
int n, k, tn, tot;
int T[sid], mx[tid], tag[tid];
struct seg {
int l, r, id;
friend bool operator < (seg a, seg b)
{ return a.l < b.l; }
} t[]; #define ls (o << 1)
#define rs (o << 1 | 1) inline void pushdown(int o) {
if(!tag[o]) return;
tag[ls] += tag[o]; mx[ls] += tag[o];
tag[rs] += tag[o]; mx[rs] += tag[o];
tag[o] = ;
} int ml, mr;
inline void mdf(int o, int l, int r) {
if(ml <= l && mr >= r) { tag[o] ++; mx[o] ++; return; }
pushdown(o);
int mid = (l + r) >> ;
if(ml > mid) mdf(rs, mid + , r);
else if(mr <= mid) mdf(ls, l, mid);
else mdf(ls, l, mid), mdf(rs, mid + , r);
mx[o] = max(mx[ls], mx[rs]);
} inline int qry(int o, int l, int r) {
if(l == r) {
if(mx[o] >= k) return l;
return ;
}
pushdown(o);
int mid = (l + r) >> ;
if(mx[rs] < k && mx[ls] < k) return ;
if(mx[rs] >= k) return qry(rs, mid + , r);
else return qry(ls, l, mid);
} int b[sid], f[];
inline void radix_sort(int *a, int n) {
rep(i, , n) ++ f[a[i] & ];
rep(i, , ) f[i] += f[i - ];
drep(i, n, ) b[f[a[i] & ] --] = a[i];
memset(f, , sizeof(f));
rep(i, , n) ++ f[b[i] >> ];
rep(i, , ) f[i] += f[i - ];
drep(i, n, ) a[f[b[i] >> ] --] = b[i];
} int main() {
n = read(); k = read();
rep(i, , n) {
t[i].id = i;
t[i].l = read(); t[i].r = read();
T[++ tot] = t[i].l; T[++ tot] = t[i].r;
}
sort(t + , t + n + );
radix_sort(T, tot);
tn = unique(T + , T + tot + ) - T - ; rep(i, , n)
t[i].r = lower_bound(T + , T + tn + , t[i].r) - T; for(ri i = , j = ; i <= tn; i ++) {
while(j <= n && t[j].l == T[i]) {
ml = i; mr = t[j].r;
mdf(, , tn); j ++;
}
int far = qry(, , tn);
if(T[far] - T[i] > ans) {
nl = i; nr = far;
ans = T[far] - T[i];
}
} write(ans);
int num = ;
rep(i, , n) {
if(t[i].l <= T[nl] && nr <= t[i].r)
num ++, write(t[i].id, ' ');
if(num == k) break;
}
return ;
}
bzoj5102 [POI2018]Prawnicy 线段树的更多相关文章
- BZOJ5102:[POI2018]Prawnicy(贪心,堆)
Description 定义一个区间(l,r)的长度为r-l,空区间的长度为0. 给定数轴上n个区间,请选择其中恰好k个区间,使得交集的长度最大. Input 第一行包含两个正整数n,k(1<= ...
- bzoj5102: [POI2018]Prawnicy
Description 定义一个区间(l,r)的长度为r-l,空区间的长度为0. 给定数轴上n个区间,请选择其中恰好k个区间,使得交集的长度最大. Input 第一行包含两个正整数n,k(1<= ...
- 【BZOJ5102】[POI2018]Prawnicy 堆
[BZOJ5102][POI2018]Prawnicy Description 定义一个区间(l,r)的长度为r-l,空区间的长度为0. 给定数轴上n个区间,请选择其中恰好k个区间,使得交集的长度最大 ...
- bzoj3932--可持久化线段树
题目大意: 最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分.超级计算机中的 任务用三元组(Si,Ei,Pi)描述,(Si,Ei,Pi)表示任务从第Si秒开始,在第 ...
- codevs 1082 线段树练习 3(区间维护)
codevs 1082 线段树练习 3 时间限制: 3 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description 给你N个数,有两种操作: 1:给区 ...
- codevs 1576 最长上升子序列的线段树优化
题目:codevs 1576 最长严格上升子序列 链接:http://codevs.cn/problem/1576/ 优化的地方是 1到i-1 中最大的 f[j]值,并且A[j]<A[i] .根 ...
- codevs 1080 线段树点修改
先来介绍一下线段树. 线段树是一个把线段,或者说一个区间储存在二叉树中.如图所示的就是一棵线段树,它维护一个区间的和. 蓝色数字的是线段树的节点在数组中的位置,它表示的区间已经在图上标出,它的值就是这 ...
- codevs 1082 线段树区间求和
codevs 1082 线段树练习3 链接:http://codevs.cn/problem/1082/ sumv是维护求和的线段树,addv是标记这歌节点所在区间还需要加上的值. 我的线段树写法在运 ...
- PYOJ 44. 【HNSDFZ2016 #6】可持久化线段树
#44. [HNSDFZ2016 #6]可持久化线段树 统计 描述 提交 自定义测试 题目描述 现有一序列 AA.您需要写一棵可持久化线段树,以实现如下操作: A v p x:对于版本v的序列,给 A ...
随机推荐
- oracle建表,设置主键,修改属性等
--建表 create table book( book_id number(10), book_name varchar2(20), book_price number(10,2), book_au ...
- 【CTF MISC】pyc文件反编译到Python源码-2017世安杯CTF writeup详解
1.题目 Create-By-SimpleLab 适合作为桌面的图片 首先是一张图片,然后用StegSolve进行分析,发现二维码 扫码得到一串字符 03F30D0A79CB0558630000000 ...
- sleep命令
sleep支持睡眠(分,小时) sleep 1 睡眠1秒 sleep 1s 睡眠1秒 sleep 1m 睡眠1分 sleep 1h 睡眠1小时
- aarch64_n2
nodejs-is-dotfile-1.0.2-2.fc26.noarch.rpm 2017-02-12 00:27 9.5K fedora Mirroring Project nodejs-is-e ...
- MongoDB(3.6.3)的用户认证初识
Windows 10家庭中文版,MongoDB 3.6.3, 前言 刚刚安装好了MongoDB,启动了服务器-mongod命令,启动了MongoDB shell-mongo命令,不过,全程都没有使用u ...
- ArcMap2SLD使用
1.首先打开ArcMap,加载一副mxd地图: 2.打开ArcGIS2SLD,如下图所示: 3.选择样式文件的保存形式,一副mxd地图可能有多个图层,选中In Separate Dateien/In ...
- python基础--logging模块
很多程序都有记录日志的需求,并且日志中包含的信息即有正常的程序访问日志,还可能有错误.警告等信息输出,python的logging模块提供了标准的日志接口,你可以通过它存储各种格式的日志,loggin ...
- java 学习网站
http://how2j.cn/ 教学网站 慕课视频下载网站 http://www.feemic.cn/mooc //慕课搜索和下载的网站http://www.soshoulu.com/tools/ ...
- C/C++之static
C++的static有两种用法:面向过程程序设计中的static和面向对象程序设计中的static.前者应用于普通变量和函数,不涉及类:后者主要说明static在类中的作用. 1.面向过程设计中的st ...
- (二)HtmlUnit 使用
第一节: htmlunit 模拟浏览器请求 第二节: htmlunit 获取指定元素 第三节: htmlunit 使用代理 IP 第四节: htmlunit 取消 css,javascript 支持 ...