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:ConcurrentHashMap类小记-3(JDK8)

    Java:ConcurrentHashMap类小记-3(JDK8) 结构说明 // 所有数据都存在table中, 只有当第一次插入时才会被加载,扩容时总是以2的倍数进行 transient volat ...

  2. 模拟赛18 T1 施工 题解

    前言: 真的是不容易啊.这个题在考场上想到了最关键的性质,但是没写出来. 后来写出来,一直调,小错不断. 没想到改的最后一个错误是两个int 乘起来爆了int 其实最后我还是觉得复杂度很假.\(n^2 ...

  3. ReentrantLock & AQS

    概念 Syncronized由于其使用的不灵活性,逐渐的被抛弃~ 常用解决方案,有以下三种使用方式:(暂时的不考虑condition的应用,暂时还没有总结出来) 同步普通方法,锁的是当前对象. 同步静 ...

  4. upload-labs通关攻略(1-11关)

    upload-labs通关攻略 upload-labs是练习文件上传很好的一个靶场,建议把upload-labs关卡全部练习一遍 1.下载安装 下载地址 链接:https://pan.baidu.co ...

  5. float32 和 float64

    float32 和 float64 Go语言中提供了两种精度的浮点数 float32 和 float64. float32,也即我们常说的单精度,存储占用4个字节,也即4*8=32位,其中1位用来符号 ...

  6. 使用psftp向服务器上传文件

    老师刚才说想用psftp上传文件到服务器,我之前没听过,学了一下,总结下.我们用PSFTP主要也就是上传和下载. PSFTP是PuTTY SFTP客户端,用于本地与服务器间安全传输文件(使用SSH连接 ...

  7. Java8新特性之Optional,如何优雅地处理空指针

    是什么 ​ 从 Java 8 引入的一个很有趣的特性是 Optional 类.Optional 类主要解决的问题是臭名昭著的空指针异常(NullPointerException)-- 每个 Java ...

  8. vue+elementUI中单选框el-radio设置默认值和唯一标识某个单选框

    vue+elementUI中单选框el-radio设置默认值 如果后台返回的单选框的值是number:单选框的lable需要设置成 :lable='0';如下: <el-form-item la ...

  9. storm调用kafka重复消费的问题

    1. 实现IBolt接口的bolt需要显式调用collector.ack(); 2. 继承自BaseBasicBlot的bolt, 会帮你自动调用ack的

  10. centos7.2安装nginx

    1 安装相关编译环境 yum install gcc-c++ yum install pcre pcre-devel yum install zlib zlib-level yum openssl o ...