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. 更好的 java 重试框架 sisyphus 的 3 种使用方式

    回顾 我们前面学习了 更好的 java 重试框架 sisyphus 入门简介 更好的 java 重试框架 sisyphus 配置的 2 种方式介绍 更好的 java 重试框架 sisyphus 背后的 ...

  2. 【UE4 C++ 基础知识】<7> 容器——TSet

    概述 TSet是一种快速容器类,(通常)用于在排序不重要的情况下存储唯一元素. TSet 类似于 TMap 和 TMultiMap,但有一个重要区别:TSet 是通过对元素求值的可覆盖函数,使用数据值 ...

  3. Ubuntu 用户管理/权限管理

    Ubuntu 用户管理/权限管理 小小记录一下 Ubuntu 下用户/权限管理常用的一些命令 用户管理 组管理 文件权限 给用户添加 sudo 权限 给用户添加 sudo 权限 首先先给出几个文件 / ...

  4. [Beta]the Agiles Scrum Meeting 12

    会议时间:2020.5.27 21:00 1.每个人的工作 今天已完成的工作 成员 已完成的工作 issue yjy 帮助解决技术问题 tq 撰写技术博客 wjx 博客评分界面美化 dzx 博客评分界 ...

  5. 脚本:bat实现自动转换windows远程端口

    问题描述:通过一个脚本可以实现windows远程端口的转换,这个是拷贝过来学习的一个脚本 @echo off color f0 echo 修改远程桌面3389端口(支持Windows 2003 200 ...

  6. Noip模拟75 2021.10.12

    T1 如何优雅的送分 他说是送分题,我就刚,没刚出来,想到莫比乌斯容斥后就都没推出来 好吧还是不能被恶心的题目,挑衅的语言打乱做题节奏 于是这一场也就没了.... $F(i)$表示$i$的不同质因子集 ...

  7. 网络摄像机中的IR-CUT详解

    自然界存在着各种波长的光线,通过折射人眼能看到不同颜色的光线,这就是光线的波长不同所导致的.其实还有许多光线是人眼看不到的,人眼识别光线的波长范围在320nm-760nm之间,超过760nm的光线人眼 ...

  8. HTML+CSS基础(HTML篇)

    引言 在日常开发Android中,很多时候会遇到和WebView打交道,对CSS HTML JS不是很清楚的话是完不成一些功能的,本篇开始学习HTML,文章的主要内容是总结了慕课网中,HTML+CSS ...

  9. 关于linux的fork的一点学习总结

    最近操作系统的实验要用到fork,于是去搜索了一下资料,很幸运地在博客中找到一篇深度好文: http://blog.csdn.net/jason314/article/details/5640969 ...

  10. Python ImportError: cannot import name ABC

    Python 3.5.2 测试可以运行 import sys from abc import ABC,abstractmethod class MyBase(ABC): @abstractmethod ...