Codeforces 题目传送门 & 洛谷题目传送门

简单题,难度 *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(分类讨论+乱搞)的更多相关文章

  1. Codeforces 685C - Optimal Point(分类讨论+乱搞)

    Codeforces 题面传送门 & 洛谷题面传送门 分类讨论神题. 首先看到最大值最小,一眼二分答案,于是问题转化为判定性问题,即是否 \(\exists x_0,y_0,z_0\) 满足 ...

  2. 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 ...

  3. hdu5105Math Problem(分类讨论)

    题目链接: huangjing 题目: 思路: 给出的是一个方程,首先讨论最高项系数. 1:a==0&& b==0  那么函数就是线性的.直接比較端点就可以. 2   a==0& ...

  4. Codeforces Gym 100203G Good elements 暴力乱搞

    原题链接:http://codeforces.com/gym/100203/attachments/download/1702/statements.pdf 题解 考虑暴力的复杂度是O(n^3),所以 ...

  5. CodeForces 81D.Polycarp's Picture Gallery 乱搞

    D. Polycarp's Picture Gallery time limit per test 2 seconds memory limit per test 256 megabytes inpu ...

  6. ZOJ Monthly, January 2019 Little Sub and his Geometry Problem ZOJ4082(模拟 乱搞)

    在一次被自己秀死... 飞机 题目: 给出N,K, Q; 给出一个N*N的矩阵  , 与K个特殊点 , 与Q次查询 , 每次查询给出一个C , 问 在这个N*N矩阵中 , 有多少的点是满足这样的一个关 ...

  7. CodeForces 788B - Weird journey [ 分类讨论 ] [ 欧拉通路 ]

    题意: 给出无向图. good way : 仅有两条边只经过一次,余下边全经过两次的路 问你共有多少条不同的good way. 两条good way不同仅当它们所经过的边的集合中至少有一条不同 (很关 ...

  8. 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 ...

  9. Codeforces 1461F - Mathematical Expression(分类讨论+找性质+dp)

    现场 1 小时 44 分钟过掉此题,祭之 大力分类讨论. 如果 \(|s|=1\),那么显然所有位置都只能填上这个字符,因为你只能这么填. scanf("%d",&n);m ...

随机推荐

  1. 解决更新页面版本后用户需CTRL+F5强刷才能应用最新页面

    设置文件永远不从缓存读取 第一步:在html文件设置文件不缓存 <!DOCTYPE html> <html lang="en" class="theme ...

  2. 【c++ Prime 学习笔记】第12章 动态内存

    对象的生存期: 全局对象:程序启动时创建,程序结束时销毁 局部static对象:第一次使用前创建,程序结束时销毁 局部自动对象:定义时创建,离开定义所在程序块时销毁 动态对象:生存期由程序控制,在显式 ...

  3. 周末愉快--css画大熊猫

    周末找了点轻松的话题,css画大熊猫. 先上效果图 欢迎竞猜大熊猫到底说了什么?? 再上源码 <!DOCTYPE html> <html lang="en"> ...

  4. Python语法1

    变量 命名规则 变量名必须是大小写英文字母.数字或下划线 _ 的组合,不能用数字开头,并且对大小写敏感 变量赋值 同一变量可以反复赋值,而且可以是不同类型的变量 i=2; i="name&q ...

  5. DevOps 时代的高效测试之路

    10 月 22 日,2021 届 DevOps 国际峰会在北京顺利召开,来自国内外的顶级技术专家共同畅谈 DevOps 体系与方法.过程与实践.工具与技术.CODING 测试及研发流程管理产品总监程胜 ...

  6. 【技术博客】在Unity3d中实现烟花效果

    在游戏开发中,我们经常需要用到类似烟花的效果.在Unity3d中,实现烟花效果的方法不止一种,我选用了Unity3d中新添加的粒子特效工具--visual effect graph来进行实现. 实现过 ...

  7. 预备知识-python核心用法常用数据分析库(上)

    1.预备知识-python核心用法常用数据分析库(上) 目录 1.预备知识-python核心用法常用数据分析库(上) 概述 实验环境 任务一:环境安装与配置 [实验目标] [实验步骤] 任务二:Pan ...

  8. stm32f103中断学习总结

    一.NVIC 介绍 NVIC 英文全称是 Nested Vectored Interrupt Controller,中文意思就是嵌套向量中断控制器,它属于 M3 内核的一个外设,控制着芯片的中断相关功 ...

  9. linux wifi热点服务脚本

    最近有关wifi热点的驱动,启动参数都调试完了,验证可以连接传输数据. 首先要在系统启动脚本中插入wifi驱动,配置wlan0的ip insmod /system/vendor/modules/818 ...

  10. DeWeb发展历程! 从2015年开始

    有位朋友问: [高中]长兴(667499XX) 2021-01-15 15:52:11 deweb会长期做吗 我查了一下,发现deweb最早从2015开始,算起来已经做了5~6年了,目前已日臻成熟!