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 ...
随机推荐
- jQuery选择器——(三)
1.基本元素选择器 id选择器:$(“#id名称”); 元素选择器:$(“元素名称”); 类选择器:$(“.类名”); 通配符:* 多个选择器共用(并集) 2.层级选择器 ancestor desce ...
- JS简介——(一)
0.结构
- linux sigaction 函数 用法释义
使用 sigaction 函数: signal 函数的使用方法简单,但并不属于 POSIX 标准,在各类 UNIX 平台上的实现不尽相同,因此其用途受 到了一定的限制.而 POSIX 标准定义的信号处 ...
- mvc 分部视图(Partial)显示登陆前后变化以及Shared文件夹在解决方案资源管理器中没有显示的问题
刚开始我的解决方案资源管理器中没有显示Shared文件夹,但Shared文件夹在项目中是实际存在的,我搜了下好像没有类似的解答(可能是我搜索的关键词不够准确).后来自己看了下vs2012. 其实解决方 ...
- springquartz的LocalDataSourceJobStore
spring 为quartz 提供了一个 继承 JobStoreCMT的 LocalDataSourceJobStore,主要是为了和spring更好的集成. public class LocalDa ...
- javascript本地缓存方案-- 存储对象和设置过期时间
cz-storage 解决问题 1. 前端js使用localStorage的时候只能存字符串,不能存储对象 cz-storage 可以存储 object undefined number string ...
- 【Netty官方文档翻译】引用计数对象(reference counted objects)
知乎有关于引用计数和垃圾回收GC两种方式的详细讲解 https://www.zhihu.com/question/21539353 原文出处:http://netty.io/wiki/referenc ...
- getch与getchar区别
getch(): 所在头文件:conio.h 函数用途:从控制台读取一个字符,但不显示在屏幕上 getchar(): 所在头文件:stdio.h getch与getchar基本功能相同,差别是getc ...
- Redux-DevTools 安装
以下以Chrome为准. 首先,从Chrome Web Store(需要***支持)下载chrome 插件 Redux DevTools. 使用方式有两种: 一种只需在代码createStore中添加 ...
- **CI中使用IN查询(where_in)
注意别漏了$this->db->get(); /** * 匹配用户手机号,返回匹配的用户列表 * @param $column_str 'user_id, user_name, user_ ...