首页
Python
Java
IOS
Andorid
NodeJS
JavaScript
HTML5
【
[BZOJ5102]Prawnicy
】的更多相关文章
[BZOJ5102]Prawnicy
Description 定义一个区间(l,r)的长度为r-l,空区间的长度为0. 给定数轴上n个区间,请选择其中恰好k个区间,使得交集的长度最大. Input 第一行包含两个正整数n,k(1<=k<=n<=1000000),表示区间的数量. 接下来n行,每行两个正整数l,r(1<=l<r<=10^9),依次表示每个区间. Output 第一行输出一个整数,即最大长度. 第二行输出k个正整数,依次表示选择的是输入文件中的第几个区间. 若有多组最优解,输出任意一组. Sam…
【BZOJ5102】[POI2018]Prawnicy 堆
[BZOJ5102][POI2018]Prawnicy Description 定义一个区间(l,r)的长度为r-l,空区间的长度为0. 给定数轴上n个区间,请选择其中恰好k个区间,使得交集的长度最大. Input 第一行包含两个正整数n,k(1<=k<=n<=1000000),表示区间的数量. 接下来n行,每行两个正整数l,r(1<=l<r<=10^9),依次表示每个区间. Output 第一行输出一个整数,即最大长度. 第二行输出k个正整数,依次表示选择的是输入文件…
bzoj5102: [POI2018]Prawnicy
Description 定义一个区间(l,r)的长度为r-l,空区间的长度为0. 给定数轴上n个区间,请选择其中恰好k个区间,使得交集的长度最大. Input 第一行包含两个正整数n,k(1<=k<=n<=1000000),表示区间的数量. 接下来n行,每行两个正整数l,r(1<=l<r<=10^9),依次表示每个区间. Output 第一行输出一个整数,即最大长度. 第二行输出k个正整数,依次表示选择的是输入文件中的第几个区间. 若有多组最优解,输出任意一组. 按左端…
BZOJ5102:[POI2018]Prawnicy(贪心,堆)
Description 定义一个区间(l,r)的长度为r-l,空区间的长度为0. 给定数轴上n个区间,请选择其中恰好k个区间,使得交集的长度最大. Input 第一行包含两个正整数n,k(1<=k<=n<=1000000),表示区间的数量. 接下来n行,每行两个正整数l,r(1<=l<r<=10^9),依次表示每个区间. Output 第一行输出一个整数,即最大长度. 第二行输出k个正整数,依次表示选择的是输入文件中的第几个区间. 若有多组最优解,输出任意一组. Sam…
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 r…
BZOJ5102 POI2018Prawnicy(堆)
考虑固定右端点,使左端点最小.那么按右端点排序后查询前缀这些区间的左端点第k小即可.然而写了一个treap一个线段树都T飞了,感觉惨爆.事实上可以用堆求第k小,维护一个大根堆保证堆中元素不超过k个即可,瞬间就跑的飞快了. #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> #include<cstring> #include<algorithm>…
BZOJ 5102: [POI2018]Prawnicy
考虑最优解的集合中一定有一个$l$最大的,我们就去枚举左端点,把所有$l$小于等于它的全丢进堆里,取前$k$个即可. #include <bits/stdc++.h> using namespace std; #define N 1000010 #define fi first #define se second #define pii pair <int, int> int n, k; struct node { int l, r, id; void scan(int _id)…
解题:POI 2018 Prawnicy
题面 网上好像都是堆的做法啊......我这个不算离散化是$O(n)$的说(虽然有一坨vector可能不开O2会爆炸) 题目即是让我们求是否存在一个最长的是不少于$k$个给出区间子集的区间,如果存在输出方案.我们发现当我们的左端点固定时,右端点越向右越可能不合法,但同时答案在不断扩大(好像不太严谨),这给了我们一个更新答案的条件:而当右端点固定左端点向右移动时,答案只会越来越合法同时越来越不优.这样我们就可以尺取做了,问题是如何统计当前区间是几个区间的子集呢? 事实上这不需要任何数据结构,我们将…
[POI2018]Prawnicy
题目大意: 有$n(n\le10^6)$个线段,每个线段覆盖的范围是$[l_i,r_i]$,要求从中选取$k(k\le10^6)$个线段使得这些线段覆盖范围的交集最大,求最大交集及任意一种方案. 思路: 对左端点排序,用堆维护右端点即可. #include<queue> #include<cstdio> #include<cctype> #include<algorithm> #include<sys/mman.h> #include<sy…
bzoj5102
$贪心$ $按左端点排序.$ $当我们钦定了最右的左端点,那么自然希望右端点尽量靠右$ $考虑之前的区间,那么我们相当于选之前的区间中第k大的右端点$ $堆维护一下就可以了,每次把新的元素放进堆,如果能更新就弹出旧的,否则弹出自己$ #include<cstdio> #include<cstring> #include<iostream> #include<queue> #include<vector> #include<algorithm…