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 web1
***本篇中的测试均需要使用python3完成. 攻击以下面脚本运作的服务器. 针对脚本的代码逻辑,写出生成利用任意代码执行漏洞的恶意序列的脚本: 打开攻击机端口, 将生成的东西输入网页cookie: ...
- 为Kubernetes集群添加用户认证
Kubernetes中的用户 K8S中有两种用户(User)--服务账号(ServiceAccount)和普通意义上的用户(User) ServiceAccount是由K8S管理的,而User通常是在 ...
- QQ消算轰炸,我好无聊真的
from pynput.keyboard import Key,Controller import time from random import choice time.sleep(5) # 创建键 ...
- python的虚拟环境Anaconda使用
Anaconda 使用conda常用命令 1.首先在所在系统中安装Anaconda.可以打开命令行输入conda -V检验是否安装以及当前conda的版本. 2.conda常用的命令. 1)con ...
- 合理占用服务器空闲GPU[狗头]
合理占用服务器GPU资源[狗头] 场景:当你想进行模型训练时,发现GPU全被占用,怎么办? 解决方案1: 在终端输入如下命令:watch -n 设定刷新时间(s) nvidia-smi 然后记起来了回 ...
- [no_code][Beta]事后分析
设想和目标 我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描述? 我们要解决的目前的手写表单的电子化问题,办公电子化问题的一个key问题.定义十分清楚: 输入: 手写表单 ...
- 种类并查集(维护敌人的敌人是朋友)、并行-poj1182-食物链 笔记
题意 输入若干组数据,代表着不同动物在食物链的位置(A,B,C),要求出在输入的过程中有多少组数据会与之前矛盾. 思路(借鉴挑战程序设计竞赛) 这题是学并查集时的题,所以用了并查集. 一开始我想的是, ...
- Java 中 List 分片的 5 种方法!
前些天在实现 MyBatis 批量插入时遇到了一个问题,当批量插入的数据量比较大时,会导致程序执行报错,如下图所示: 原因是 MySQL 只能执行一定长度的 SQL 语句,但当插入的数据量较多时,会生 ...
- zabbix 自定义监控项,监控tomcat访问量
uv:访客量.每个独立上网电脑视为一位访客.pv:访问量.页面浏览量或者点击量,访客每访问一次记录一次. 1.创建文件 /home/zabbix/pvuv_number.sh [ #/bin/bash ...
- GO 字符串反转
字符串反转 即 abc 反转后成 cba 思路:两边都设置一个游标,然后互换位置,游标同步向中间移动,再互换. for i, j := 0, len(s)-1; i < j; i, j = i+ ...