由于交换是相邻交换,所以分为两类:
1.左右区间内部交换,那么一定会让逆序对数量$\pm 1$,也就是说如果没有左右区间之间交换,那么答案就是$|ansL-ansR|$(ans表示逆序对数量)
2.左右区间之间交换,考虑枚举左边最终有多少个1,不妨假设比原来多(原来少一样,但不能都异或1之后重复一遍,会错的),首先一定尽量交换左边的最右边的若干个0和右边最左边的若干个1,然后快速的去维护两边的逆序对数量
维护方式很简单,由于假如左边如果改变了一个点,说明它的右边一定都是同样的数字,所以不用线段树,只需要维护左边的前缀和即可(右边同理)

 1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 200005
4 int n,a[N],sum[N];
5 long long s,ans1,ans2,ans;
6 int pre(int k){
7 k--;
8 while ((k)&&(!a[k]))k--;
9 return k;
10 }
11 int nex(int k){
12 k++;
13 while ((k<=2*n)&&(a[k]))k++;
14 return k;
15 }
16 void calc1(){
17 s=ans1=ans2=0;
18 for(int i=1;i<=n;i++)
19 if (!a[i])ans1+=sum[i-1];
20 for(int i=2*n;i>n;i--)
21 if (a[i])ans2+=sum[i+1];
22 ans=min(ans,abs(ans1-ans2));
23 for(int x=pre(n+1),y=nex(n);(x)&&(y<=2*n);x=pre(x),y=nex(y)){
24 s+=y-x;
25 ans1+=sum[x];
26 ans2+=sum[y];
27 ans=min(ans,s+abs(ans1-ans2));
28 }
29 }
30 void calc2(){
31 s=ans1=ans2=0;
32 for(int i=1;i<=n;i++)
33 if (a[i])ans1+=sum[i-1];
34 for(int i=2*n;i>n;i--)
35 if (!a[i])ans2+=sum[i+1];
36 for(int x=pre(n+1),y=nex(n);(x)&&(y<=2*n);x=pre(x),y=nex(y)){
37 s+=y-x;
38 ans1-=sum[x];
39 ans2-=sum[y];
40 ans=min(ans,s+abs(ans1-ans2));
41 }
42 }
43 int main(){
44 scanf("%d",&n);
45 for(int i=1;i<=2*n;i++)scanf("%d",&a[i]);
46 for(int i=1;i<=n;i++)sum[i]=sum[i-1]+a[i];
47 for(int i=2*n;i>n;i--)sum[i]=sum[i+1]+(a[i]^1);
48 ans=1LL*n*n;
49 calc1();
50 for(int i=1;i<=2*n;i++)a[i]^=1;
51 calc2();
52 printf("%lld",ans);
53 }

最新文章

  1. 编写高质量代码:改善Java程序的151个建议(第5章:数组和集合___建议75~78)
  2. 50个C/C++源代码网站
  3. plain framework 1 参考手册 入门指引之 许可协议
  4. ArrayBlockingQueue-我们到底能走多远系列(42)
  5. 《Linux内核设计的艺术》学习笔记(五)INT 0x10中断
  6. 消格子时一个很深的bug的修复纪录
  7. Angular学习(5)- 数组双向梆定+filter
  8. Qt 日志宏
  9. 菜鸟互啄:WINFORM如何实现无聚焦框的Button按钮
  10. Python处理Excel(转载)
  11. Linux学习之在搭建java开发环境
  12. CSS像素、物理像素、逻辑像素、设备像素比、PPI、Viewport
  13. 『链接』Microsoft Visual C Redistributable/VC 再发行库 下载哪家强?
  14. Day1 Numerical simulation of optical wave propagation之标量衍射理论基本原理(一)
  15. SNF软件开发机器人-子系统-功能-【列表】自由排序-如何配置?
  16. python 常用模块之random,os,sys 模块
  17. 物联网架构成长之路(15)-Jenkins部署SpringBoot
  18. oracle 如何创建只有查询权限的用户
  19. android开发(33) 让 actionbar 透明2
  20. vue-router登录校验后跳转到之前指定页面如何实现

热门文章

  1. ansible远程运维操作
  2. SpringIOC 理论推导
  3. 《手把手教你》系列技巧篇(三十)-java+ selenium自动化测试- Actions的相关操作下篇(详解教程)
  4. Parcel Fabric Tools(宗地结构工具)
  5. linux下修改IP地址的方法
  6. 关于takin-data,你想知道的都在这里(二)trace日志篇
  7. 混合开发框架Flutter
  8. alertmanager的使用
  9. gson中TypeAdapter实现自定义序列化操作
  10. 关于stm32串口必须要学的5个串口以及串口应用和注意事项