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