Solution to luogu P7514——普及选手也能看懂!
题目链接
洛谷
题目大意
一堆二元组,按第一个元素升序排列,现在可以使用 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——普及选手也能看懂!相关推荐
- 【优秀选手采访】看十强选手如何顺利拿下腾讯offer
腾讯广告算法大赛一直以来面向全社会吸引各方算法达人,通过真实的广告产品和场景.丰富多元极具挑战力的赛题设置,为腾讯广告遴选出大量杰出人才,促进技术创新,帮助腾讯广告不断成长,构筑国内领先的大数据营销平 ...
- 微软麻将AI Suphx或引入“凤凰房”,与其他AI对打
作者 | 夕颜 出品 | AI科技大本营(ID:rgznai100) [导读]在刚刚结束的上海2019世界人工智能大会上,微软宣布了其在人工智能领域的最新研究突破--由微软亚洲研究院研发的麻将 AI ...
- Codeforces Round #706 (Div. 2)-A. Split it!-题解
目录 Codeforces Round #706 (Div. 2)-A. Split it! Problem Description Input Output Sample Input Sample ...
- noip2017爆炸记——题解总结反省(普及组+提高组)
相关链接: noip2018总结 noip2017是我见过的有史以来最坑爹的一场考试了. 今年北京市考点有一个是我们学校,我还恰好被分到了自己学校(还是自己天天上课的那个教室),于是我同时报了普及提高 ...
- Luogu P1087 FBI树
P1087 FBI树 题目描述 我们可以把由"0"和"1"组成的字符串分为三类:全"0"串称为B串,全"1"串称为I串, ...
- 影像组学视频学习笔记(37)-机器学习模型判断脑卒中发病时间(文献报告)、Li‘s have a solution and plan.
作者:北欧森林 链接:https://www.jianshu.com/p/3e7a2c84288e 来源:简书,已获授权转载 RadiomicsWorld.com "影像组学世界" ...
- 夺冠!中国队国际奥数大赛再称雄,满分选手已保送清华姚班,“中国二队”并列第一...
晓查 栗子 发自 凹非寺 量子位 出品 | 公众号 QbitAI 经过16.17两日的角逐,在英国巴斯举办的第60届国际数学奥林匹克竞赛(IMO 2019)终于落下帷幕.中国队和美国队以227分并列第 ...
- 分治法【锦标赛问题:设计一个满足以下要求的比赛日程表: (1)每个选手必须与其他n-1个选手各赛一次; (2)每个选手一天只能赛一次; (3)循环赛一共进行n-1天。】
目 录 1.问题 2.问题分析 3.程序代码(非递归) 4.程序代码(递归) 5.总结 1.问题 锦标赛问题:设计一个满足以下要求的比赛日程表: (1)每个选手必须与其他n-1个选手各赛一次: ( ...
- [GO语言基础] 二.编译运行、语法规范、注释转义及API标准库知识普及
作为网络安全初学者,会遇到采用Go语言开发的恶意样本.因此从今天开始从零讲解Golang编程语言,一方面是督促自己不断前行且学习新知识:另一方面是分享与读者,希望大家一起进步.前文介绍了什么是GO语言 ...
最新文章
- 2021年大数据Spark(四十八):Structured Streaming 输出终端/位置
- IDEA源码阅读利器 — UML类图插件Diagram
- 人群行为分类数据库--Novel Dataset for Fine-grained Abnormal Behavior Understanding in Crowd
- MongoDB3.4 版本新节点同步的一点惊喜
- Python模块——subprocess
- Qt工作笔记-QTreeWidgetItem中type的基本用法
- 保护你的DLL和Code不被别人使用。
- mysql要将语句反复执行15次_MySQL多表查询疑问
- 国产杀毒软件连续因“作弊”遭全球权威评测机构指责
- Centos:更换为网易镜像源
- 2009程序员考试大纲
- 人工智能基础入门——神经网络讲解
- 正弦和余弦(角度到弧度)
- 数据结构 创建结构体学生表 c语言
- c语言与程序设计曹计昌 答案,c语言与程序设计答案曹计昌
- 我的世界服务器ess汉化文件,《我的世界》ess插件指令大全
- iconfont用在placeholder里
- 王传宝老师--宏观经济学家--金融研究专家---沪师经纪刘建
- 基于spring boot 的学生科研项目共享平台 毕业设计-附源码271611
- 将光盘中的cda保存到电脑中