Codeforces 1513F - Swapping Problem(分类讨论+乱搞)
简单题,难度 *2500 的 D2F,就当调节一下一模炸裂了的自闭的心情,稍微写写吧。
首先我看到这题的第一反应是分类讨论+数据结构,即枚举其中一个被交换的位置然后用树状数组或类似的数据结构维护另一个决策的贡献,细节似乎挺多的,大概硬刚个大分类讨论上去也可以?不过显然此题有更简便的方法所以这种方法就没写了。
我们来观察一下这个“交换”有什么性质,这个绝对值有点烦,我们不妨将所有 \(i\) 分为两类:\(a_i<b_i\) 和 \(a_i>b_i\)。至于 \(a_i=b_i\) 的情况,显然它进行交换之后答案不会更优,所以我们姑且就不用考虑它了。
一个 observation 是对于满足 \(a_i<b_i,a_j<b_j\) 的情况,交换 \(i,j\) 的情况肯定是不优的,具体证明就考虑将每个 \(a_i,b_i\) 看作一个区间 \([a_i,b_i]\),对两个区间 \([a_i,b_i],[a_j,b_j]\) 的位置关系分情况讨论:
- 相离,不妨设 \(a_i\le b_i\le a_j\le b_j\),那么交换前贡献为 \(b_i-a_i+b_j-a_j\),交换后贡献为 \(b_j-a_i+a_j-b_i\),前者 \(\le\) 后者。
- 相交,不妨设 \(a_i\le a_j\le b_i\le b_j\),那么交换前贡献为 \(b_i-a_i+b_j-a_j\),交换后贡献为 \(b_j-a_i+b_j-a_i\),前者 \(=\) 后者。
- 内含,不妨设 \(a_i\le a_j\le b_j\le b_i\),那么交换前贡献为 \(b_i-a_i+b_j-a_j\),交换后贡献为 \(b_j-a_i+a_j-b_i\),前者 \(=\) 后者。
也就是说我们只会选择 \(a_i<b_i\) 和 \(a_j>b_j\) 的 \(i,j\) 进行交换,那么这个贡献该怎么算呢?还是将它们看作一个个区间 \([a_i,b_i]\) 和 \([b_j,a_j]\),我们从变化量的角度入手,即记交换后贡献为 \(W'\),原来的贡献为 \(W\),转而讨论 \(W'-W\) 的最小值,这个也可以分三种情况讨论:
- 相离,不妨设 \(a_i\le b_i\le b_j\le a_j\),那么交换前贡献为 \(a_j-b_j+b_i-a_i\),交换后贡献为 \(a_j-b_i+b_j-a_i\),变化量 \(\Delta=2(b_j-b_i)\),不难发现这恒为非负,也就是说我们肯定不会交换这两个值,故我们可姑且将这种情况的贡献看作 \(0\)。
- 相交,不妨设 \(a_i\le b_j\le b_i\le a_j\),那么交换前贡献为 \(a_j-b_j+b_i-a_i\),交换后贡献为 \(a_j-b_i+b_j-a_i\),\(\Delta=2(b_j-b_i)\)
- 内含,不妨设 \(a_i\le b_j\le a_j\le b_i\),那么交换前贡献为 \(a_j-b_j+b_i-a_i\),交换后贡献为 \(b_j-a_i+b_i-a_j\),\(\Delta=2(b_j-a_j)\)
不难发现,对于上面的情况,变化量的最小可能值恰为 \([a_i,b_i]\) 和 \([b_j,a_j]\) 的交集的长度,于是随便排个序 two pointers 乱搞搞即可,时间复杂度 \(n\log n\)
1A,就 nm 爽
const int MAXN=2e5;
int n,a[MAXN+5],b[MAXN+5],ans=0;
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
for(int i=1;i<=n;i++) scanf("%d",&b[i]);
vector<int> v1,v2;
for(int i=1;i<=n;i++){
if(a[i]<b[i]) v1.pb(i);
if(a[i]>b[i]) v2.pb(i);
}
sort(v1.begin(),v1.end(),[](int x,int y){return a[x]<a[y];});
sort(v2.begin(),v2.end(),[](int x,int y){return b[x]<b[y];});
for(int i=0,j=0,mx=0;i<v1.size();i++){
while(j<v2.size()&&b[v2[j]]<=a[v1[i]]){
chkmax(mx,a[v2[j]]);j++;
} chkmax(ans,min(mx-a[v1[i]],b[v1[i]]-a[v1[i]]));
}
for(int i=0,j=0,mx=0;i<v2.size();i++){
while(j<v1.size()&&a[v1[j]]<=b[v2[i]]){
chkmax(mx,b[v1[j]]);j++;
} chkmax(ans,min(mx-b[v2[i]],a[v2[i]]-b[v2[i]]));
} ll sum=0;
for(int i=1;i<=n;i++) sum+=abs(a[i]-b[i]);
printf("%lld\n",sum-(ans<<1));
return 0;
}
Codeforces 1513F - Swapping Problem(分类讨论+乱搞)的更多相关文章
- Codeforces 685C - Optimal Point(分类讨论+乱搞)
Codeforces 题面传送门 & 洛谷题面传送门 分类讨论神题. 首先看到最大值最小,一眼二分答案,于是问题转化为判定性问题,即是否 \(\exists x_0,y_0,z_0\) 满足 ...
- codeforces 653C C. Bear and Up-Down(乱搞题)
题目链接: C. Bear and Up-Down time limit per test 2 seconds memory limit per test 256 megabytes input st ...
- hdu5105Math Problem(分类讨论)
题目链接: huangjing 题目: 思路: 给出的是一个方程,首先讨论最高项系数. 1:a==0&& b==0 那么函数就是线性的.直接比較端点就可以. 2 a==0& ...
- Codeforces Gym 100203G Good elements 暴力乱搞
原题链接:http://codeforces.com/gym/100203/attachments/download/1702/statements.pdf 题解 考虑暴力的复杂度是O(n^3),所以 ...
- CodeForces 81D.Polycarp's Picture Gallery 乱搞
D. Polycarp's Picture Gallery time limit per test 2 seconds memory limit per test 256 megabytes inpu ...
- ZOJ Monthly, January 2019 Little Sub and his Geometry Problem ZOJ4082(模拟 乱搞)
在一次被自己秀死... 飞机 题目: 给出N,K, Q; 给出一个N*N的矩阵 , 与K个特殊点 , 与Q次查询 , 每次查询给出一个C , 问 在这个N*N矩阵中 , 有多少的点是满足这样的一个关 ...
- CodeForces 788B - Weird journey [ 分类讨论 ] [ 欧拉通路 ]
题意: 给出无向图. good way : 仅有两条边只经过一次,余下边全经过两次的路 问你共有多少条不同的good way. 两条good way不同仅当它们所经过的边的集合中至少有一条不同 (很关 ...
- Playrix Codescapes Cup (Codeforces Round #413, rated, Div. 1 + Div. 2)(A.暴力,B.优先队列,C.dp乱搞)
A. Carrot Cakes time limit per test:1 second memory limit per test:256 megabytes input:standard inpu ...
- Codeforces 1461F - Mathematical Expression(分类讨论+找性质+dp)
现场 1 小时 44 分钟过掉此题,祭之 大力分类讨论. 如果 \(|s|=1\),那么显然所有位置都只能填上这个字符,因为你只能这么填. scanf("%d",&n);m ...
随机推荐
- Python 做简单的登录系统
案例 之 登录系统原创作品1 该随笔 仅插入部分代码:全部py文件源代码请从百度网盘自行下载! 链接:https://pan.baidu.com/s/1_sTcDvs5XEGDcnpoQEIrMg 提 ...
- 【数据结构与算法Python版学习笔记】递归(Recursion)——优化问题与策略
分治策略:解决问题的典型策略,分而治之 将问题分为若干更小规模的部分 通过解决每一个小规模部分问题,并将结果汇总得到原问题的解 递归算法与分治策略 递归三定律 体现了分支策略 应用相当广泛 排序 查找 ...
- UltraSoft - Beta - Scrum Meeting 11
Date: May 27th, 2020. Scrum 情况汇报 进度情况 组员 负责 今日进度 q2l PM.后端 记录会议 Liuzh 前端 增加了对重复日程的支持 Kkkk 前端 测试验证前后端 ...
- BUAAOO第四单元总结
---恢复内容开始--- 一.本单元两次作业的架构设计 第十三次作业:本次作业我创建了四个类,除去官方提供的Main和MyUmlInteraction类之外,还有Uclass和Ulinterface分 ...
- BUAA 2020 软件工程 个人项目作业
BUAA 2020 软件工程 个人项目作业 Author: 17373051 郭骏 项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 个人项目作业 ...
- 修改openstack镜像--支持root密码登陆
一.前言 从openstack官方下载的云镜像一般都是普通用户密钥登陆,比如centos镜像的普通用户为centos,ubuntu镜像的普通用户为ubuntu,虽然密钥登陆系统相比密码登陆来说比较方便 ...
- kail入侵xp实例
Kali的IP地址是192.168.0.112 Windows XP的IP地址是192.168.0.108 本文演示怎么使用Metasploit入侵windows xp sp3. 启动msfconso ...
- 禁用root直接远程登录,使用普通账号登录后再切换root
1.创建一个普通用户 #useradd test 2.给test设置密码 #passwd test 3.禁用root远程登录 #vim /etc/ssh/sshd_config #PermitRoot ...
- gitbook热更新时报错operation not permitted
在使用gitbook写东西的时候,当文档内容有更新的时候,会自动更新内容到页面上,方便预览.但是,存在一个bug,就是会神奇的崩溃掉,出现如下的错误提示: Restart after change i ...
- 稳了!我准备了1个晚上的CMS垃圾收集器
面试官:今天还是来聊聊CMS垃圾收集器呗? 候选者:嗯啊... 候选者:如果用Seria和Parallel系列的垃圾收集器:在垃圾回收的时,用户线程都会完全停止,直至垃圾回收结束! 候选者:CMS的全 ...