解题:POI 2018 Prawnicy
网上好像都是堆的做法啊......我这个不算离散化是$O(n)$的说(虽然有一坨vector可能不开O2会爆炸)
题目即是让我们求是否存在一个最长的是不少于$k$个给出区间子集的区间,如果存在输出方案。我们发现当我们的左端点固定时,右端点越向右越可能不合法,但同时答案在不断扩大(好像不太严谨),这给了我们一个更新答案的条件;而当右端点固定左端点向右移动时,答案只会越来越合法同时越来越不优。这样我们就可以尺取做了,问题是如何统计当前区间是几个区间的子集呢?
事实上这不需要任何数据结构,我们将每个区间拆成左右端点分别用vector存起来,同时开一个数组用来标记,然后当我们的指针遇到区间时讨论:
如果左指针碰到左端点,检查一下这个区间的右端点是否在右指针右边,如果在且这个区间还没被标记,则标记它并记录贡献
如果右指针扫过右端点(注意是扫过),检查一下这个区间是否被标记,如果被标记则移除它的贡献
如果右指针碰到右端点,检查一下这个区间的左端点是否在左指针左边,如果在且这个区间还没被标记,则标记它并记录贡献
这样如果不算离散化就是$O(n)$的辣
#include<cstdio>
#include<vector>
#include<cstring>
#include<utility>
#include<algorithm>
using namespace std;
const int N=;
vector<pair<int,int> > ln[*N],rn[*N];
int n,k,c,p1,p2,a1,a2,cnt,xnt,tot,ans;
int ll[N],rr[N],uni[*N],mark[N];
void renew(int typ)
{
if(!typ)
{
for(int i=;i<(int)ln[p1].size();++i)
if(ln[p1][i].first>=p2)
if(!mark[ln[p1][i].second])
mark[ln[p1][i].second]=true,xnt++;
}
else
{
for(int i=;i<(int)rn[p2-].size();i++)
if(mark[rn[p2-][i].second])
mark[rn[p2-][i].second]=false,xnt--;
for(int i=;i<(int)rn[p2].size();i++)
if(rn[p2][i].first<=p1)
if(!mark[rn[p2][i].second])
mark[rn[p2][i].second]=true,xnt++;
}
}
int main ()
{
scanf("%d%d",&n,&k);
for(int i=;i<=n;i++)
{
scanf("%d%d",&ll[i],&rr[i]);
uni[++tot]=ll[i],uni[++tot]=rr[i];
}
sort(uni+,uni++tot),tot=unique(uni+,uni++tot)-uni-;
for(int i=;i<=n;i++)
{
ll[i]=lower_bound(uni+,uni++tot,ll[i])-uni;
rr[i]=lower_bound(uni+,uni++tot,rr[i])-uni;
ln[ll[i]].push_back(make_pair(rr[i],i));
rn[rr[i]].push_back(make_pair(ll[i],i));
}
p1=p2=;
while(p1<=tot&&p2<=tot)
{
if(p1>p2) p2=p1,renew();
if(xnt>=k)
{
while(xnt>=k&&p2<=tot) p2++,renew();
if(uni[p2-]-uni[p1]>ans) ans=max(ans,uni[p2-]-uni[p1]),a1=p1,a2=p2-;
}
p1++,renew();
}
printf("%d\n",ans);
for(int i=;i<=n&&c<k;i++)
if(ll[i]<=a1&&rr[i]>=a2)
printf("%d ",i),c++;
return ;
}
解题:POI 2018 Prawnicy的更多相关文章
- [POI 2018] Prawnicy
[题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=5102 [算法] 首先,n条线段的交集一定是[Lmax,Rmin] , 其中,Lmax ...
- POI 2018.10.20
[POI2005]BANK-Cash Dispenser 有多少个4位字符串是所有操作序列的子串. 10^4枚举字符串.暴力判断会TLE 发现,我们就是在每个操作序列中不断找第一个出现的c字符. 预处 ...
- POI 2018.10.27
[POI2015]LOG 维护一个长度为n的序列,一开始都是0,支持以下两种操作:1.U k a 将序列中第k个数修改为a.2.Z c s 在这个序列上,每次选出c个正数,并将它们都减去1,询问能否进 ...
- POI 2018.10.22
[POI2015]ODW 喵锟讲过.分块. N>=blo,那就暴力倍增往上跳.O(N/blo*logN) N<blo,预处理,f[i][j]表示,i往上跳,每次跳j步,到根节点为止,权值和 ...
- POI 2018.10.21
[POI2008]TRO-Triangles https://www.cnblogs.com/GXZlegend/p/7509699.html 平面上有N个点. 求出所有以这N个点为顶点的三角形的面积 ...
- [POI 2018] Plan Metra
[题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=5100 [算法] 首先分两类考虑 : 1. 1 -> N的路径不经过其它节点 , ...
- jshzoi
解题报告——2018级2016第二学期第一周作业 解题报告——2018级2016第二学期第一周作业 D 算24 题目描述 描述 给出4个小于10个正整数,你可以使用加减乘除4种运算以及括号把这4个 ...
- NOIP 2018 普及组 解题报告
目录 标题统计 题目链接 思路 代码 龙虎斗 题目链接: 思路 代码 摆渡车 题目链接: 思路 对称二叉树 题目链接 思路: 先来解释一下为毛现在才来发解题报告: 其实博主是参加过NOIP 2018普 ...
- 「九省联考 2018」IIIDX 解题报告
「九省联考 2018」IIIDX 这什么鬼题,送的55分要拿稳,实测有60? 考虑把数值从大到小摆好,每个位置\(i\)维护一个\(f_i\),表示\(i\)左边比它大的(包括自己)还有几个数可以选 ...
随机推荐
- idea compare功能 之一次bug修复
一次bug修复 最近开发完了一套单点系统,jenkins打包上传到服务器就出问题, 可以启动但是不能正常工作. 首先想到的是环境不一样, 于是把jenkins的jdk和maven都调整和本机大版本相同 ...
- Linux内核学习笔记(4)-- wait、waitpid、wait3 和 wait4
进程调用 exit() 退出执行后,被设置为僵死状态,这时父进程可以通过 wait4() 系统调用查询子进程是否终结,之后再进行最后的操作,彻底删除进程所占用的内存资源. wait4() 系统调用由 ...
- 【Python进阶】无论API怎么变,SDK都可以根据URL实现完全动态的调用
现在很多网站都搞REST API,比如新浪微博.豆瓣啥的,调用API的URL类似: http://api.server/user/friends http://api.server/user/time ...
- 大前端全栈CSS3移动端开发
作者声明:本博客中所写的文章,都是博主自学过程的笔记,参考了很多的学习资料,学习资料和笔记会注明出处,所有的内容都以交流学习为主.有不正确的地方,欢迎批评指正 本节课学习视频来源:https://ww ...
- ffmpe安装
原文:https://www.jianshu.com/p/905df3d9e753 下载安装 下载最新源码包并解压 $ wget http://ffmpeg.org/releases/ffmpeg-3 ...
- Firefox必备的24款web开发插件
from: 软件过滤: 排序:收录时间 | 浏览数 网页开发FireFox插件 Firebug Firebug是Firefox下的一款开发类插件,现属于Firefox的 五星级强力推荐插件之一.它集H ...
- rsa加密算法,前后端实现。
前端js: 下载地址:http://travistidwell.com/jsencrypt/ js第一版本: // 对数据加密 function encrypt(enStr){ //没有加载jsenc ...
- IOC与DI(xml 配置)
Spring可以帮助我们管理软件开发过程中的对象,以及如何创建和维护对象之间的关系. Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架,可以将组建的耦合度降至最低,即实现解耦 ...
- 对scrum站立会议的理解
个人理解:首先我不明白scrum的含义,查了一下,scrum是迭代式增量软件开发过程,通常用于敏捷开发.scrum包括了一系列实践和预定义角色的过程骨架.scrum中的主要角色包括同项目经理类似的sc ...
- IDEA换行CRLF, LF, CR的解释和默认设置
在window下开发有一个大坑,就是换行默认是CRLF,也就是回车换行,但是Linux下只有换行LF,这样代码提交后,会出现编译问题,所以最好的办法是在IDEA下设置默认为LF. 首先我们先介绍CRL ...