Problem Description
You have a sequence {a1,a2,...,an} and
you can delete a contiguous subsequence of length m.
So what is the minimum number of inversions after the deletion.
 

Input
There are multiple test cases. The first line of input contains an integer T,
indicating the number of test cases. For each test case:

The first line contains two integers n,m(1≤n≤105,1≤m<n) -
the length of the seuqence. The second line contains n integers a1,a2,...,an(1≤ai≤n).

The sum of n in
the test cases will not exceed 2×106.
 

Output
For each test case, output the minimum number of inversions.
 

Sample Input

2
3 1
1 2 3
4 2
4 1 3 2
 

Sample Output

0

1

这场bc的题解虽然很难懂,但是弄明白后觉得写的很好。

令g_ig​i​​表示在ii前面比a_ia​i​​大的数的个数, f_if​i​​表示在ii后面比a_ia​i​​小的数的个数, 这两个都可以用树状数组轻松求出来. 那么对于一个长度LL的连续子序列, 删掉它之后逆序对减少的个数就是这段区间中g_ig​i​​的和 + 这段区间f_if​i​​的和 - 这段区间的逆序对个数. 求区间逆序对个数只要用一个树状数组维护就好了, 每次只是删除最左端的一个数和加入最右端的一个数, 分别统计下贡献.

这里删除一段区间而少的逆序对其实就是区间左边每个数比区间大的数的和以及区间右边比区间内部小的数的个数和,还有区间本身的逆序对。

这里用树状数组的时候要注意,不要总是更新到maxn ,更新到n就行了,不然会超时。

#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<vector>
#include<map>
#include<set>
#include<queue>
#include<stack>
#include<string>
#include<algorithm>
using namespace std;
#define ll long long
#define inf 0x7fffffff
#define maxn 100100
ll sum1[maxn],sum2[maxn];
ll b[maxn+10],f[maxn],g[maxn],a1[maxn],a[maxn];
int n; ll lowbit(ll x){
return x&(-x);
} void update(ll pos,ll num){
while(pos<=n){
b[pos]+=num;pos+=lowbit(pos);
}
}
ll getsum(ll pos){
ll num=0;
while(pos>0){
num+=b[pos];pos-=lowbit(pos);
}
return num;
}
void clear(){
int i;
for(i=1;i<=n+1;i++)b[i]=0;
} int main()
{
int m,i,j,T,tot;
ll ans,cnt;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++){
scanf("%lld",&a[i]);
} clear();
sum1[0]=sum2[n+1]=0;
for(i=1;i<=n;i++){
g[i]=getsum(n)-getsum(a[i]);
update(a[i],1);
sum1[i]=sum1[i-1]+g[i];
}
clear();
for(i=n;i>=1;i--){
f[i]=getsum(a[i]-1);
update(a[i],1);
}
for(i=1;i<=n;i++)sum2[i]=sum2[i-1]+f[i]; clear();
cnt=ans=0;
for(i=m;i>=1;i--){
ans+=getsum(a[i]-1);
update(a[i],1);
}
cnt=sum1[m]+sum2[m]-ans;
for(i=2;i+m-1<=n;i++){
ans-=getsum(a[i-1]-1);
update(a[i-1],-1);
ans+=getsum(n)-getsum(a[i+m-1]);
update(a[i+m-1],1);
if(cnt<sum1[i+m-1]-sum1[i-1]+sum2[i+m-1]-sum2[i-1]-ans){
cnt=sum1[i+m-1]-sum1[i-1]+sum2[i+m-1]-sum2[i-1]-ans;
}
}
printf("%lld\n",sum2[n]-cnt); }
return 0;
}

hdu5497 Inversion的更多相关文章

  1. hdu-5497 Inversion(滑动窗口+树状数组)

    题目链接: Inversion Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)T ...

  2. HDU 1394 Minimum Inversion Number ( 树状数组求逆序数 )

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1394 Minimum Inversion Number                         ...

  3. 控制反转Inversion of Control (IoC) 与 依赖注入Dependency Injection (DI)

    控制反转和依赖注入 控制反转和依赖注入是两个密不可分的方法用来分离你应用程序中的依赖性.控制反转Inversion of Control (IoC) 意味着一个对象不会新创建一个对象并依赖着它来完成工 ...

  4. HDU 1394 Minimum Inversion Number(最小逆序数 线段树)

    Minimum Inversion Number [题目链接]Minimum Inversion Number [题目类型]最小逆序数 线段树 &题意: 求一个数列经过n次变换得到的数列其中的 ...

  5. 依赖倒置原则(Dependency Inversion Principle)

    很多软件工程师都多少在处理 "Bad Design"时有一些痛苦的经历.如果发现这些 "Bad Design" 的始作俑者就是我们自己时,那感觉就更糟糕了.那么 ...

  6. HDU 1394 Minimum Inversion Number(最小逆序数/暴力 线段树 树状数组 归并排序)

    题目链接: 传送门 Minimum Inversion Number Time Limit: 1000MS     Memory Limit: 32768 K Description The inve ...

  7. Inversion Sequence(csu 1555)

    Description For sequence i1, i2, i3, … , iN, we set aj to be the number of members in the sequence w ...

  8. ACM: 强化训练-Inversion Sequence-线段树 or STL·vector

    Inversion Sequence Time Limit:2000MS     Memory Limit:262144KB     64bit IO Format:%lld & %llu D ...

  9. ACM Minimum Inversion Number 解题报告 -线段树

    C - Minimum Inversion Number Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d &a ...

随机推荐

  1. python模块详解 | shutil

    简介: shutil是python的一个内置模块,提供了许多关于文件和文件集合的高级操作,特别提供文件夹与文件操作.归档操作了支持文件复制和删除的功能. 文件夹与文件操作: copyfileobj(f ...

  2. 【Python】部署上手App后端服务器 - Linux环境搭建安装Python、Tornado、SQLAlchemy

    基于阿里云服务器端环境搭建 文章目录 基于阿里云服务器端环境搭建 配置开发环境 安装 Python 3.8.2 安装 Tornado 安装 MySQL 安装 mysqlclient 安装 SQLAlc ...

  3. 鸿蒙的远程交互组件应用及微信小程序的远程交互组件应用

    注:鸿蒙的远程交互组件应用相对复杂 ,访问网络时,首先要配置网络权限,华为官方文档有问题,在此引用我老师配置的模板,见附件 过程:1.导入鸿蒙的网络请求模块fetch 2.发起对服务器的请求(在这过程 ...

  4. [Usaco2007 Jan]Telephone Lines架设电话线

    题目描述 FarmerJohn打算将电话线引到自己的农场,但电信公司并不打算为他提供免费服务.于是,FJ必须为此向电信公司支付一定的费用.FJ的农场周围分布着N(1<=N<=1,000)根 ...

  5. SW3518中文规格书

    SW3518 是一款高集成度的多快充协议双口充电芯片, 支持 A+C 口任意口快充输出, 支持双口独立限流. 其集成了 5A 高效率同步降压变换器, 支持 PPS/PD/QC/AFC/FCP/SCP/ ...

  6. ORM动态表达式树查询

    前言 接口获取参数后,创建返回值模型的条件表达式作为参数,传入使用依赖注入实例化后的业务层. 业务层创建返回值模型的IQUERY后,再使用参数条件表达式.最后进行延迟查询. 代码实现 参数模型Demo ...

  7. CMU数据库(15-445)-实验2-B+树索引实现(中)删除

    3. Delete 实现 附上实验2的第一部分 https://www.cnblogs.com/JayL-zxl/p/14324297.html 3. 1 删除算法原理 如果叶子结点中没有相应的key ...

  8. 从零搭建一个IdentityServer——项目搭建

    本篇文章是基于ASP.NET CORE 5.0以及IdentityServer4的IdentityServer搭建,为什么要从零搭建呢?IdentityServer4本身就有很多模板可以直接生成一个可 ...

  9. 使用pushplus+python实现亚马逊到货消息推送微信

    xbox series和ps5发售以来,国内黄牛价格一直居高不下.虽然海外amazon上ps5补货很少而且基本撑不过一分钟,但是xbox series系列明显要好抢很多. 日亚.德亚的xbox ser ...

  10. try-catch-finally中的4个大坑,不小心就栽进去了!

    在 Java 语言中 try-catch-finally 看似简单,一副人畜无害的样子,但想要真正的"掌控"它,却并不是一件容易的事.别的不说,咱就拿 fianlly 来说吧,别看 ...