题面

网上好像都是堆的做法啊......我这个不算离散化是$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的更多相关文章

  1. [POI 2018] Prawnicy

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=5102 [算法] 首先,n条线段的交集一定是[Lmax,Rmin] , 其中,Lmax ...

  2. POI 2018.10.20

    [POI2005]BANK-Cash Dispenser 有多少个4位字符串是所有操作序列的子串. 10^4枚举字符串.暴力判断会TLE 发现,我们就是在每个操作序列中不断找第一个出现的c字符. 预处 ...

  3. POI 2018.10.27

    [POI2015]LOG 维护一个长度为n的序列,一开始都是0,支持以下两种操作:1.U k a 将序列中第k个数修改为a.2.Z c s 在这个序列上,每次选出c个正数,并将它们都减去1,询问能否进 ...

  4. POI 2018.10.22

    [POI2015]ODW 喵锟讲过.分块. N>=blo,那就暴力倍增往上跳.O(N/blo*logN) N<blo,预处理,f[i][j]表示,i往上跳,每次跳j步,到根节点为止,权值和 ...

  5. POI 2018.10.21

    [POI2008]TRO-Triangles https://www.cnblogs.com/GXZlegend/p/7509699.html 平面上有N个点. 求出所有以这N个点为顶点的三角形的面积 ...

  6. [POI 2018] Plan Metra

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=5100 [算法] 首先分两类考虑 : 1. 1 -> N的路径不经过其它节点 , ...

  7. jshzoi

    解题报告——2018级2016第二学期第一周作业   解题报告——2018级2016第二学期第一周作业 D 算24 题目描述 描述 给出4个小于10个正整数,你可以使用加减乘除4种运算以及括号把这4个 ...

  8. NOIP 2018 普及组 解题报告

    目录 标题统计 题目链接 思路 代码 龙虎斗 题目链接: 思路 代码 摆渡车 题目链接: 思路 对称二叉树 题目链接 思路: 先来解释一下为毛现在才来发解题报告: 其实博主是参加过NOIP 2018普 ...

  9. 「九省联考 2018」IIIDX 解题报告

    「九省联考 2018」IIIDX 这什么鬼题,送的55分要拿稳,实测有60? 考虑把数值从大到小摆好,每个位置\(i\)维护一个\(f_i\),表示\(i\)左边比它大的(包括自己)还有几个数可以选 ...

随机推荐

  1. 获取Java线程返回值的几种方式

    在实际开发过程中,我们有时候会遇到主线程调用子线程,要等待子线程返回的结果来进行下一步动作的业务. 那么怎么获取子线程返回的值呢,我这里总结了三种方式: 主线程等待. Join方法等待. 实现Call ...

  2. Paper Reading - Sequence to Sequence Learning with Neural Networks ( NIPS 2014 )

    Link of the Paper: https://arxiv.org/pdf/1409.3215.pdf Main Points: Encoder-Decoder Model: Input seq ...

  3. music, let's go

    最近研究个新玩意,叫window.AudioContext;不懂?没关系,我也是才接触,这完全可以说个全新领域,这玩意干啥的?顾名思义,媒体上下文,也就是你媒体的数据分析,就是一串数据啊?那有啥用呢? ...

  4. 浅谈TSM概念、系统架构及技术发展

    NFC作为一种近距离的无线通信技术,提供了一种更直接.更安全的现场交互解决方案.它能够允许电子设备之间进行非接触式点对点数据传输,实现数据交换.访问内容与服务.有了它,手机不再只是打电话.发短信以及上 ...

  5. Scrum立会报告+燃尽图(十一月十七日总第二十五次):设计调查问卷;修复上一阶段bug

    此作业要求参见:https://edu.cnblogs.com/campus/nenu/2018fall/homework/2284 项目地址:https://git.coding.net/zhang ...

  6. 评价Win8自带输入法

    对于人机交互设计,有以下四个基本原则:从用户角度考虑.从头到尾记住用户选择.短期刺激和长期使用的好处坏处.不让用户犯简单错误.我用的最多的是我的系统自带的输入法,评价的也只能是它了. 1.从用户角度: ...

  7. lintcode-65-两个排序数组的中位数

    65-两个排序数组的中位数 两个排序的数组A和B分别含有m和n个数,找到两个排序数组的中位数,要求时间复杂度应为O(log (m+n)). 样例 给出数组A = [1,2,3,4,5,6] B = [ ...

  8. 第5章 Linux 常用网络指令

    网络参数设定使用的指令 手动/自动设定与启动/关闭 IP 参数: ifconfig, ifup, ifdown ifconfig :查询.设定网络卡与 IP 网域等相关参数:ifup, ifdown: ...

  9. ranch代码简述

    最近要看一下erlang连接池,觉得ranch很不错. github上面有人写了ranch的代码阅读,可以看一下,链接在这里. 1. ranch可以同时监听多个端口,每个端口的连接信息可以单独配置. ...

  10. Qt多线程-总结QThread-QThreadPool-QtConcurrent

    版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:Qt多线程-总结QThread-QThreadPool-QtConcurrent     本文 ...