题目链接

洛谷

题目大意

一堆二元组,按第一个元素升序排列,现在可以使用 m m m次操作,每次操作使一个二元组两个元素交换,求所有二元组第一个元素构成的数组的极差的最小值。

考场解法

大法师, 20 p t s 20pts 20pts。

考完之后发现我傻*了。

n 2 n^2 n2解法(普及组难度)

显然,产生极差的最大值和最小值一定都是某个二元组的元素(不然零头会被浪费)。也就是说最大值和最小值均只有 2 n 2n 2n级别种情况。

先把这 2 n 2n 2n个元素理起来排好序,再枚举最大值和最小值,判断是否合法即可。

考虑判断。枚举完最大值和最小值,就必定有一连串卡片( a i ∈ [ m i n , m a x ] a_i∈[min,max] ai​∈[min,max])的不用翻了。其他的全要翻。那么就有两种情况使答案不合法。

1、要翻的卡片数量 > m >m >m。用 n n n减去不要翻的即可。

2、要翻的卡片中,有 b i b_i bi​值在枚举范围之外的(这些卡片怎么翻也没用)。由于不要翻的卡片是连续一段(题中 a i a_i ai​升序),要翻的卡片一定是前后缀,故预处理 b i b_i bi​前后缀最值,若最值不在该范围内则整组解不合法。

复杂度 O ( 2 n × 2 n ) = O ( n 2 ) O(2n×2n)=O(n^2) O(2n×2n)=O(n2)。期望 40 p t s 40pts 40pts。

线性解法(也是普及组难度)

考虑答案的单调性。

如果值域 [ x , y ] [x,y] [x,y]不可行,那么值域 [ x + k , y ] ( k > 0 ) [x+k,y](k>0) [x+k,y](k>0)一定不可行。证明分情况讨论。

  • 若上次是因为翻牌太多不可行,那值域变小意味着要翻的牌更多,显然不可行。

  • 若上次是因为有一张牌正反面均超出值域,那这一次值域变小,更加超出值域,不可行。

由于我们要做这道题,所以每一次的 y y y一定是在当前 x x x下最小的,也就是 [ x , y − 1 ] [x,y-1] [x,y−1]就不行了,所以当 x x x变大时, y y y至少是上次的 y y y。也即, y y y随 x x x单调不减。

考虑 T w o _ P o i n t e r s Two\_Pointers Two_Pointers。复杂度 O ( n ) O(n) O(n)。期望 100 p t s 100pts 100pts。具体细节看代码。

附两组样例。

#include<bits/stdc++.h>
using namespace std;
typedef long long ak;
#define im INT_MAX
#define F(i,j,k) for(int i=j;i<=k;i++)
#define G(i,j,k) for(int i=j;i>=k;i--)
int ans=im,cur=1,a[1111111],b[1111111],c[2222222],n,m,mn=im,mx=-im,xj[2222222],sj[2222222],premin[1111111],premax[1111111],sufmin[1111111],sufmax[1111111];
bool lpc(int i,int j){return i<j;
}
bool cxk(int jcd){int l=xj[cur],r=sj[jcd];if(l>r)return 0;if(r==n&&l==1)return 1;if(r==n){if(l-1>m)return 0;if(premin[l-1]<c[cur])return 0;if(premax[l-1]>c[jcd])return 0;return 1;}if(l==1){if(n-r>m)return 0;if(sufmin[r+1]<c[cur])return 0;if(sufmax[r+1]>c[jcd])return 0;return 1;}if(n-r+l-1>m)return 0;if(premin[l-1]<c[cur])return 0;if(premax[l-1]>c[jcd])return 0;if(sufmin[r+1]<c[cur])return 0;if(sufmax[r+1]>c[jcd])return 0;return 1;
}
int main(){ios::sync_with_stdio(0);cin>>n>>m;F(i,1,n)cin>>a[i];F(i,1,n)cin>>b[i];F(i,1,n){mn=min(mn,b[i]);premin[i]=mn;mx=max(mx,b[i]);premax[i]=mx;c[i*2-1]=b[i];c[i<<1]=a[i];}mx=-im,mn=im;G(i,n,1){mn=min(mn,b[i]);sufmin[i]=mn;mx=max(mx,b[i]);sufmax[i]=mx;}sort(c+1,c+n*2+1,lpc);a[n+5]=im;//´Ë´¦·ÀÖ¹cur³¬½ç¡£ÎÒΪ´Ë±¬ÁËÒ»´ÎÁã¡£F(i,1,n<<1){while(a[cur]<c[i])cur++;xj[i]=cur;}cur=n;G(i,n<<1,1){while(a[cur]>c[i])cur--;sj[i]=cur;}int jcd=1;F(i,1,n<<1){cur=i;bool f=0;while(!cxk(jcd)){jcd++;if(jcd>n*2){f=1;break;}}if(f)break;ans=min(ans,c[jcd]-c[cur]);}cout<<ans<<"\n";return 0;
}
/*10 53  5  9 11 13 17 19 22 24 29
13 12 18  5  7 33 12 10 22 11
ans=1110 5
180 193 194 225 260 273 276 314 316 322
271 1 255 234 196 500 250 240 218 205
ans=80*/

Solution to luogu P7514——普及选手也能看懂!相关推荐

  1. 【优秀选手采访】看十强选手如何顺利拿下腾讯offer

    腾讯广告算法大赛一直以来面向全社会吸引各方算法达人,通过真实的广告产品和场景.丰富多元极具挑战力的赛题设置,为腾讯广告遴选出大量杰出人才,促进技术创新,帮助腾讯广告不断成长,构筑国内领先的大数据营销平 ...

  2. 微软麻将AI Suphx或引入“凤凰房”,与其他AI对打

    作者 | 夕颜 出品 | AI科技大本营(ID:rgznai100) [导读]在刚刚结束的上海2019世界人工智能大会上,微软宣布了其在人工智能领域的最新研究突破--由微软亚洲研究院研发的麻将 AI ...

  3. Codeforces Round #706 (Div. 2)-A. Split it!-题解

    目录 Codeforces Round #706 (Div. 2)-A. Split it! Problem Description Input Output Sample Input Sample ...

  4. noip2017爆炸记——题解总结反省(普及组+提高组)

    相关链接: noip2018总结 noip2017是我见过的有史以来最坑爹的一场考试了. 今年北京市考点有一个是我们学校,我还恰好被分到了自己学校(还是自己天天上课的那个教室),于是我同时报了普及提高 ...

  5. Luogu P1087 FBI树

    P1087 FBI树 题目描述 我们可以把由"0"和"1"组成的字符串分为三类:全"0"串称为B串,全"1"串称为I串, ...

  6. 影像组学视频学习笔记(37)-机器学习模型判断脑卒中发病时间(文献报告)、Li‘s have a solution and plan.

    作者:北欧森林 链接:https://www.jianshu.com/p/3e7a2c84288e 来源:简书,已获授权转载 RadiomicsWorld.com "影像组学世界" ...

  7. 夺冠!中国队国际奥数大赛再称雄,满分选手已保送清华姚班,“中国二队”并列第一...

    晓查 栗子 发自 凹非寺 量子位 出品 | 公众号 QbitAI 经过16.17两日的角逐,在英国巴斯举办的第60届国际数学奥林匹克竞赛(IMO 2019)终于落下帷幕.中国队和美国队以227分并列第 ...

  8. 分治法【锦标赛问题:设计一个满足以下要求的比赛日程表: (1)每个选手必须与其他n-1个选手各赛一次; (2)每个选手一天只能赛一次; (3)循环赛一共进行n-1天。】

    目   录 1.问题 2.问题分析 3.程序代码(非递归) 4.程序代码(递归) 5.总结 1.问题 锦标赛问题:设计一个满足以下要求的比赛日程表: (1)每个选手必须与其他n-1个选手各赛一次: ( ...

  9. [GO语言基础] 二.编译运行、语法规范、注释转义及API标准库知识普及

    作为网络安全初学者,会遇到采用Go语言开发的恶意样本.因此从今天开始从零讲解Golang编程语言,一方面是督促自己不断前行且学习新知识:另一方面是分享与读者,希望大家一起进步.前文介绍了什么是GO语言 ...

最新文章

  1. 2021年大数据Spark(四十八):Structured Streaming 输出终端/位置
  2. IDEA源码阅读利器 — UML类图插件Diagram
  3. 人群行为分类数据库--Novel Dataset for Fine-grained Abnormal Behavior Understanding in Crowd
  4. MongoDB3.4 版本新节点同步的一点惊喜
  5. Python模块——subprocess
  6. Qt工作笔记-QTreeWidgetItem中type的基本用法
  7. 保护你的DLL和Code不被别人使用。
  8. mysql要将语句反复执行15次_MySQL多表查询疑问
  9. 国产杀毒软件连续因“作弊”遭全球权威评测机构指责
  10. Centos:更换为网易镜像源
  11. 2009程序员考试大纲
  12. 人工智能基础入门——神经网络讲解
  13. 正弦和余弦(角度到弧度)
  14. 数据结构 创建结构体学生表 c语言
  15. c语言与程序设计曹计昌 答案,c语言与程序设计答案曹计昌
  16. 我的世界服务器ess汉化文件,《我的世界》ess插件指令大全
  17. iconfont用在placeholder里
  18. 王传宝老师--宏观经济学家--金融研究专家---沪师经纪刘建
  19. 基于spring boot 的学生科研项目共享平台 毕业设计-附源码271611
  20. 将光盘中的cda保存到电脑中

热门文章

  1. 小程序实现用户申请发票、查看申请的发票记录功能
  2. Edge浏览器插件WeTab免费体验ChatGPT
  3. 初学C语言的感悟——书山有路勤为径。
  4. 【C#】【xUnit】【Moq】.NET单元测试Mock框架Moq初探!
  5. Perl中怎样从数组中删除某个值?
  6. 机器学习(Dog vs Cat)猫狗大战
  7. 分享一个技术分享bolg网址
  8. 三菱FX3U485-BD与台达变频器modbus通讯
  9. 最新爱情经典语录 真爱一个人,就要尽量让他开心
  10. 文件上传FileUpload