正题

题目链接:https://www.luogu.com.cn/problem/P7514


题目大意

给出\(n\)个卡牌有\(a_i/b_i\),开始都是\(a_i\)朝上,将不超过\(m\)张卡牌变为\(b_i\)面朝上,使得朝上的数字中最大值减去最小值最小。

\(3\leq n\leq 10^6,1\leq m<n,1\leq a_i,b_i\leq 10^9\)


解题思路

虽然数据比较水,但是题目也是一道比较水的贪心题。

先离散化然后考虑暴力点的想法。枚举最大值和最小值\(l,r\),那么对于\(a_i\)在\([l,r]\)之间的自然是不理,在之外的一定需要翻,如果翻转后存在\(b_i\)不在\([l,r]\)之间,那么显然行不通。

这样我们就可以\(O(n^2)\)了。

不难发现假设\([l,r]\)行的通那么\([l,r+1]\)用原来的方法一定也行得通,所以对于\(r\)递增,\(l\)也是不降的,双指针维护一下就好了。

时间复杂度\(O(n\log n)\)


code

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cctype>
using namespace std;
const int N=2e6+10;
int n,m,ans,a[N],b[N],c[N],mx[N],mi[N],nx[N],ni[N],pos[N];
int read(){
int x=0,f=1;char c=getchar();
while(!isdigit(c)){if(c=='-')f=-f;c=getchar();}
while(isdigit(c)){x=(x<<1)+(x<<3)+c-'0';c=getchar();}
return x*f;
}
bool cmp(int x,int y)
{return a[x]<a[y];}
bool check(int l,int r){
int L=pos[l],R=pos[r+1]-1;
int k=m-(n-R)-(L-1);
if(k<0)return 0;
if(mx[L-1]>r||mi[L-1]<l)return 0;
if(nx[R+1]>r||ni[R+1]<l)return 0;
return 1;
}
int main()
{
n=read();m=read();
for(int i=1;i<=2*n;i++)a[i]=b[i]=read(),c[i]=i;
sort(c+1,c+1+2*n,cmp);int cnt=2*n;
for(int i=1;i<=2*n;i++)a[c[i]]=i;
mi[0]=ni[n+1]=1e9+7;
for(int i=1;i<=n;i++)mx[i]=max(a[i+n],mx[i-1]);
for(int i=1;i<=n;i++)mi[i]=min(a[i+n],mi[i-1]);
for(int i=n;i>=1;i--)nx[i]=max(a[i+n],nx[i+1]);
for(int i=n;i>=1;i--)ni[i]=min(a[i+n],ni[i+1]);
for(int i=1;i<=n;i++)pos[a[i]]=i;pos[cnt+1]=n+1;
for(int i=cnt;i>=1;i--)
if(!pos[i])pos[i]=pos[i+1];
ans=1e9+7;int z=0;
for(int i=1;i<=cnt;i++){
while(z<i&&check(z+1,i))z++;
if(z)ans=min(ans,b[c[i]]-b[c[z]]);
}
printf("%d\n",ans);
}

P7514-[省选联考2021A/B卷]卡牌游戏【贪心】的更多相关文章

  1. P7518-[省选联考2021A/B卷]宝石【主席树,二分】

    正题 题目链接:https://www.luogu.com.cn/problem/P7518 题目大意 给出\(n\)个点的一棵树,每个点上有不大于\(m\)的数字. 然后给出一个长度为\(c\)的各 ...

  2. [省选联考 2020 A 卷] 组合数问题

    题意 [省选联考 2020 A 卷] 组合数问题 想法 自己在多项式和数论方面还是太差了,最近写这些题都没多少思路,看完题解才会 首先有这两个柿子 \(k*\dbinom{n}{k} = n*\dbi ...

  3. [省选联考 2021 A 卷] 矩阵游戏

    很巧妙的一个构造. 我是没有想到的. 自己的思维能力可能还是不足. 考虑先满足\(b\)对\(a\)的限制,把\(a\)的第一行和第一列设\(0\),推出这个\(a\). 接下来考虑对这个\(a\), ...

  4. [省选联考 2021 A/B 卷] 卡牌游戏

    垃圾福建垫底选手来看看这题. 大家怎么都写带 \(log\) 的. 我来说一个线性做法好了. 那么我们考虑枚举 \(k\) 作为翻转完的最小值. 那么构造出一个满足条件的操作,我们在 \(a_i\) ...

  5. luoguP6623 [省选联考 2020 A 卷] 树(trie树)

    luoguP6623 [省选联考 2020 A 卷] 树(trie树) Luogu 题外话: ...想不出来啥好说的了. 我认识的人基本都切这道题了. 就我只会10分暴力. 我是傻逼. 题解时间 先不 ...

  6. luoguP6620 [省选联考 2020 A 卷] 组合数问题(斯特林数)

    luoguP6620 [省选联考 2020 A 卷] 组合数问题(斯特林数) Luogu 题外话: LN切这题的人比切T1的多. 我都想到了组合意义乱搞也想到可能用斯特林数为啥还是没做出来... 我怕 ...

  7. luoguP6624 [省选联考 2020 A 卷] 作业题(莫比乌斯反演,矩阵树定理)

    luoguP6624 [省选联考 2020 A 卷] 作业题(莫比乌斯反演,矩阵树定理) Luogu 题外话: Day2一题没切. 我是傻逼. 题解时间 某种意义上说刻在DNA里的柿子,大概是很多人学 ...

  8. P7515-[省选联考 2021A卷]矩阵游戏【差分约束】

    正题 题目链接:https://www.luogu.com.cn/problem/P7515 题目大意 有一个\(n*m\)的矩形\(A\),然后给出一个\((n-1)*(m-1)\)的矩形\(B\) ...

  9. 洛谷P6623——[省选联考 2020 A 卷] 树

    传送门:QAQQAQ 题意:自己看 思路:正解应该是线段树/trie树合并? 但是本蒟蒻啥也不会,就用了树上二次差分 (思路来源于https://www.luogu.com.cn/blog/dengy ...

随机推荐

  1. C#中的几种锁:用户模式锁、内核模式锁、动态计数、监视锁

    参考网址: https://blog.csdn.net/weixin_43989331/article/details/105356008 C#中的几种锁:用户模式锁.内核模式锁.动态计数.监视锁介绍 ...

  2. C++基于ATL工程编写ActiveX控件步骤

    参考网址: https://blog.csdn.net/whui19890911/article/details/8896554 开发环境:VS2010 开发工程:C++ATL项目 开发目的:创建Ac ...

  3. 【spring 注解驱动开发】spring组件注册

    尚学堂spring 注解驱动开发学习笔记之 - 组件注册 组件注册 1.@Configuration&@Bean给容器中注册组件 2.@ComponentScan-自动扫描组件&指定扫 ...

  4. 1.3RDD的设计与运行原理

    此文为个人学习笔记如需系统学习请访问http://dblab.xmu.edu.cn/blog/1709-2/ 提供一种通用的数据抽象 RDD典型的执行过程如下: RDD读入外部数据源(或者内存中的集合 ...

  5. 转:自增(自减)在Java与C中的区别

    转自:http://seiyatime.blog.sohu.com/84358295.html 话说昨日面试,在笔试的25个选择题中,涉及自增自减不止一两题,以前在开发过程中并没太在意这方面的问题,也 ...

  6. Android Studio 百度地图导航

    配置就不再多说了,上一篇已经详细说过了,这次就是根据经纬度坐标做地图导航,路径规划.直接上代码: package com.example.appview.mian_page.Frament.Anzhu ...

  7. sychronized

    说一下 synchronized 底层实现原理? synchronized可以保证方法或者代码块在运行时, 同一时刻只有一个方法可以进入到临界区, 同时它还可以保证共享变量的内存可见性. Java中每 ...

  8. http请求包含哪几个部分(请求行、请求头、请求体)

    http协议报文     1.请求报文(请求行/请求头/请求数据/空行)         请求行             求方法字段.URL字段和HTTP协议版本             例如:GET ...

  9. SpringBoot笔记(2)

    一.容器功能 1.1 组件添加 1. @Configuration Full模式:获取对象时,首先在容器内搜索是否存在,如存在直接拿出 默认为Full模式,单例 配置类组件之间有依赖关系,方法会被调用 ...

  10. viper配置管理

    安装 go get github.com/spf13/viper viper支持的功能 1.可以设置默认值 2.可以加载多种格式的配置文件,如JSON,TOML,YAML,HCL和Java属性配置文件 ...