$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 线段树的更多相关文章

  1. BZOJ5102:[POI2018]Prawnicy(贪心,堆)

    Description 定义一个区间(l,r)的长度为r-l,空区间的长度为0. 给定数轴上n个区间,请选择其中恰好k个区间,使得交集的长度最大. Input 第一行包含两个正整数n,k(1<= ...

  2. bzoj5102: [POI2018]Prawnicy

    Description 定义一个区间(l,r)的长度为r-l,空区间的长度为0. 给定数轴上n个区间,请选择其中恰好k个区间,使得交集的长度最大. Input 第一行包含两个正整数n,k(1<= ...

  3. 【BZOJ5102】[POI2018]Prawnicy 堆

    [BZOJ5102][POI2018]Prawnicy Description 定义一个区间(l,r)的长度为r-l,空区间的长度为0. 给定数轴上n个区间,请选择其中恰好k个区间,使得交集的长度最大 ...

  4. bzoj3932--可持久化线段树

    题目大意: 最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分.超级计算机中的 任务用三元组(Si,Ei,Pi)描述,(Si,Ei,Pi)表示任务从第Si秒开始,在第 ...

  5. codevs 1082 线段树练习 3(区间维护)

    codevs 1082 线段树练习 3  时间限制: 3 s  空间限制: 128000 KB  题目等级 : 大师 Master 题目描述 Description 给你N个数,有两种操作: 1:给区 ...

  6. codevs 1576 最长上升子序列的线段树优化

    题目:codevs 1576 最长严格上升子序列 链接:http://codevs.cn/problem/1576/ 优化的地方是 1到i-1 中最大的 f[j]值,并且A[j]<A[i] .根 ...

  7. codevs 1080 线段树点修改

    先来介绍一下线段树. 线段树是一个把线段,或者说一个区间储存在二叉树中.如图所示的就是一棵线段树,它维护一个区间的和. 蓝色数字的是线段树的节点在数组中的位置,它表示的区间已经在图上标出,它的值就是这 ...

  8. codevs 1082 线段树区间求和

    codevs 1082 线段树练习3 链接:http://codevs.cn/problem/1082/ sumv是维护求和的线段树,addv是标记这歌节点所在区间还需要加上的值. 我的线段树写法在运 ...

  9. PYOJ 44. 【HNSDFZ2016 #6】可持久化线段树

    #44. [HNSDFZ2016 #6]可持久化线段树 统计 描述 提交 自定义测试 题目描述 现有一序列 AA.您需要写一棵可持久化线段树,以实现如下操作: A v p x:对于版本v的序列,给 A ...

随机推荐

  1. python程序练习题集

    1.#输入a,b,c,d4个整数,计算a+b-c*d的结果 a=input("please input a nimber:") b=input("please input ...

  2. Shell中三种引号的用法及区别

    Linux Shell中有三种引号,分别为双引号(" ").单引号(' ')以及反引号(` `). 其中双引号对字符串中出现的$.''.`和\进行替换:单引号不进行替换,将字符串中 ...

  3. 通过PDB文件实现非嵌入式的c++反射

    上一篇blog我阐述了一种实现非嵌入式的反射的基本思路.相比于通过宏和模板实现,这种非嵌入的反射的优点是不需要写额外的代码来记录meta信息. 首先,为了在c++中实现反射系统,我认为需要解决以下两个 ...

  4. USB descriptor【转】

    struct usb_device_descriptor { __u8 bLength;//设备描述符的字节数大小,为0x12 __u8 bDescriptorType;//描述符类型编号,为0x01 ...

  5. MySQL分布式集群之MyCAT(一)简介【转】

    隔了好久,才想起来更新博客,最近倒腾的数据库从Oracle换成了MySQL,研究了一段时间,感觉社区版的MySQL在各个方面都逊色于Oracle,Oracle真的好方便!好了,不废话,这次准备记录一些 ...

  6. JavaScript 简单吗

    英文:Aurélien Hervé  译文:众成翻译/msmailcode 这里有一些 Javascript初学者应该知道的技巧和陷阱.如果你已经是专家了,顺便温习一下. Javascript也只不过 ...

  7. 十八、springboot中hibernate配置sessionFactory访问数据库

    前提 在yml或properties文件中配置数据库与数据库连接池 Hibernate配置 几种方式: 方式一: @Configuration public class HibernateConfig ...

  8. 分布式git

    分布式 Git 你现在拥有了一个远程 Git 版本库,能为所有开发者共享代码提供服务,在一个本地工作流程下,你也已经熟悉 了基本 Git 命令.你现在可以学习如何利用 Git 提供的一些分布式工作流程 ...

  9. 华夏部分互联网科技公司创始及IPO信息

    时间:2018-04-19 前面整理了一些美国科技公司的信息,这篇文章整理的是我华夏的一些科技公司的信息. 华为.百度.阿里.腾讯.美团.携程.京东.小米.奇虎360……之后,其它一些公司,要么体量 ...

  10. /touch滑屏事件

    //touch滑屏事件     var windowHeight = $(window).height(),     $body = $("body");     $body.cs ...