$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. 下拉框 select

    1.select 用来做什么? select 用于实现下来下拉列表,其 html 结构是这样的: <select name="city" id="city" ...

  2. cin.get()和cin.getline()之间的区别

    cin.getline()和cin.get()都是对输入的面向行的读取,即一次读取整行而不是单个数字或字符,但是二者有一定的区别. cin.get()每次读取一整行并把由Enter键生成的换行符留在输 ...

  3. java创建并配置多module的maven项目

    1 使用idea创建(推荐) 这篇博客写的特别好,很详细: https://blog.csdn.net/sinat_30160727/article/details/78109769 2 使用ecli ...

  4. Android Bander设计与实现 - 设计

    Binder Android IPC Linux 内核 驱动 摘要 Binder是Android系统进程间通信(IPC)方式之一.Linux已经拥有管道,system V IPC,socket等IPC ...

  5. innobackupex 相关语法讲解【转】

    innobackupex 相关语法讲解 连接服务器 The database user used to connect to the server and its password are speci ...

  6. Java WebService Axis 初探

    最近在学习WebService 开始了: 一:服务端的编写与发布 1. 工具准备: java的开发环境(这里就不多说了).   axis2官网上下载最新的就可以了(我这里用的是axis2-1.4.1- ...

  7. mysql取以当前时间为中心的任意时间段的时间戳

    例如:取当前时间后一年的时间戳 SELECT UNIX_TIMESTAMP(date_sub(curdate(),interval -1 YEAR)) SELECT UNIX_TIMESTAMP(da ...

  8. kafka集群及监控部署

    1. kafka的定义 kafka是一个分布式消息系统,由linkedin使用scala编写,用作LinkedIn的活动流(Activity Stream)和运营数据处理管道(Pipeline)的基础 ...

  9. InnoDB锁问题

    InnoDB锁问题 InnoDB与MyISAM的最大不同有两点:一是支持事务(TRANSACTION):二是采用了行级锁.行级锁与表级锁本来就有许多不同之处,另外,事务的引入也带来了一些新问题.下面我 ...

  10. maven学习--生命周期

    clean --清理项目 default --构建项目(最核心)  ===========compile , test , package , install site --生成项目站点