$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. PHP autoload自动加载机制

    原文地址: http://www.jb51.net/article/31399.htm 一直不是很明白__autoload()和spl_autoload_register()到底有什么不同,找到了一个 ...

  2. 富文本存储型XSS的模糊测试之道

    富文本存储型XSS的模糊测试之道 凭借黑吧安全网漏洞报告平台的公开案例数据,我们足以管中窥豹,跨站脚本漏洞(Cross-site Script)仍是不少企业在业务安全风险排查和修复过程中需要对抗的“大 ...

  3. zookeeper zkClient api 使用

    操作步骤: 一.引入zkclient的jar包(maven方式) <dependency> <groupId>com.101tec</groupId> <ar ...

  4. idea开发工具下载安装教程

    我用这款工具主要用于java开发 在安装这个工具之前需要配置java的环境 java的jdk环境配置 jdk:1.8 jdk官网下载链接 --->点我 进入之后,下拉  选择 jdk1.8版本 ...

  5. tftp的安装

    下载并且安装软件xinetd tftp tftpd sudo apt-get install xinetd tftp tftpd 在/etc/xinetd.d/下建立一个配置文件tftp sudo v ...

  6. webpack轻松入门教程

    webpack之傻瓜式教程及前端自动化入门 接触webpack也有挺长一段时间了,公司的项目也是一直用着webpack在打包处理,但前几天在教新人的情况下,遇到了一个问题,那就是:尽管网上的webpa ...

  7. java基础21 System类和Runtime类

    一.System系统类 1.1.System系统类 主要用于获取系统信息 1.2.System类的常用方法 arraycopy(Object src, int srcPos, Object dest, ...

  8. (五)动态SQL

    第一节:if条件 第二节:choose,when和otherwise条件 第三节:where条件 1.自动加上where: 2.如果where子句以and或者or开头,则自动删除第一个and或者or: ...

  9. SQL 标量函数-----日期函数 day() 、month()、year()

    select day(createtime) from life_unite_product --取时间字段的天值 select month(createtime) from life_unite_p ...

  10. SQLServer判断指定列的默认值是否存在,并修改默认值

    SQLServer判断指定列的默认值是否存在,并修改默认值 2008年10月21日 星期二 下午 12:08 if exists(select A.name as DefaultName,B.name ...