E. K Integers(树状数组 邮件问题)

2024-03-13 08:30

本文主要是介绍E. K Integers(树状数组 邮件问题),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

https://codeforces.com/problemset/problem/1269/E

题意:

给出一个序列,每次可以交换两个相邻的数。

对于每一个 i ∈ [ 1 , n ] i\in[1,n] i[1,n],求某个子段为 1 , 2... i 1,2...i 1,2...i的最少交换次数。n最大2e5

解析:

假设定下最后的 1 , 2... i 1,2...i 1,2...i出现的段的位置 k + 1 , k + 2... k + i k+1,k+2...k+i k+1,k+2...k+i,那么有两种转移的方式

  1. 将1移到 k + 1 k+1 k+1,将2移到 k + 2 k+2 k+2……
  2. 将所有数先移到此区域,再排序。
    例如: i = 3 i=3 i=3,先将 3 , 4 , 2 , 1 , 5 3,4,2,1,5 3,4,2,1,5移动为 4 , 3 , 2 , 1 , 5 4,3,2,1,5 4,3,2,1,5,再内部排为 4 , 1 , 2 , 3 , 5 4,1,2,3,5 4,1,2,3,5

可以证明两种方法的次数相同,因为第一种方法相当于在过程中交换顺序而已。


所以可以按照第二种办法,分两个部分:

先计算内部排序的最少次数:直接树状数组即可

然后是移到指定地方的最少次数,这个可以参考以前做过的邮局问题。可以证明:

  1. 在奇数个点时中心点落在处于第 ( n + 1 ) / 2 (n+1)/2 (n+1)/2个点最优。
  2. 偶数个点时两个中心点放在第 n / 2 n/2 n/2个点和第 n / 2 + 1 n/2+1 n/2+1个点中间最优。

在这里插入图片描述

将所有pos放到set里,用center记录当前的中心pos(偶数个时左边那个点),然后更新center,再用树状数组求一下移动所需步数。

代码:

/**  Author : Jk_Chen*    Date : 2020-02-03-12.35.55*/
#include<bits/stdc++.h>
using namespace std;
#define LL long long
#define rep(i,a,b) for(int i=(int)(a);i<=(int)(b);i++)
#define per(i,a,b) for(int i=(int)(a);i>=(int)(b);i--)
#define mmm(a,b) memset(a,b,sizeof(a))
#define pb push_back
#define pill pair<int, int>
#define fi first
#define se second
#define debug(x) cerr<<#x<<" = "<<x<<'\n'
const LL mod=1e9+7;
const int maxn=2e5+9;
const int inf=0x3f3f3f3f;
LL rd(){ LL ans=0; char last=' ',ch=getchar();while(!(ch>='0' && ch<='9'))last=ch,ch=getchar();while(ch>='0' && ch<='9')ans=ans*10+ch-'0',ch=getchar();if(last=='-')ans=-ans; return ans;
}
#define rd rd()
/*_________________________________________________________begin*/int n;
int a[maxn];
int pos[maxn];
LL tr[maxn];
void update(int pos,LL val){while(pos<=n){tr[pos]+=val;pos+=pos&-pos;}
}
LL query(int pos){LL res=0;while(pos){res+=tr[pos];pos-=pos&-pos;}return res;
}
LL v1[maxn];
LL v2[maxn];int main(){n=rd;rep(i,1,n){a[i]=rd;pos[a[i]]=i;}rep(i,1,n){int p=pos[i];v1[i]=v1[i-1]+query(n)-query(p);update(p,1);}mmm(tr,0);set<LL>S;LL center;rep(i,1,n){S.insert(pos[i]);update(pos[i],pos[i]);if(i==1){center=pos[1];}else{if(i&1){if(pos[i]>center){auto it=S.find(center);center=*(++it);}}else{if(pos[i]<center){auto it=S.find(center);center=*(--it);}}}if(i&1){LL L=(center-i/2+center)*(i/2+1)/2-query(center);LL R=query(n)-query(center)-(center+1+center+i/2)*(i/2)/2;v2[i]=L+R;}else{LL L=(center-i/2+1+center)*(i/2)/2-query(center);LL R=query(n)-query(center)-(center+1+center+i/2)*(i/2)/2;v2[i]=L+R;}}rep(i,1,n){printf("%lld%c",v1[i]+v2[i]," \n"[i==n]);}return 0;
}/*_________________________________________________________end*/

这篇关于E. K Integers(树状数组 邮件问题)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/804235

相关文章

MybatisGenerator文件生成不出对应文件的问题

《MybatisGenerator文件生成不出对应文件的问题》本文介绍了使用MybatisGenerator生成文件时遇到的问题及解决方法,主要步骤包括检查目标表是否存在、是否能连接到数据库、配置生成... 目录MyBATisGenerator 文件生成不出对应文件先在项目结构里引入“targetProje

C#使用HttpClient进行Post请求出现超时问题的解决及优化

《C#使用HttpClient进行Post请求出现超时问题的解决及优化》最近我的控制台程序发现有时候总是出现请求超时等问题,通常好几分钟最多只有3-4个请求,在使用apipost发现并发10个5分钟也... 目录优化结论单例HttpClient连接池耗尽和并发并发异步最终优化后优化结论我直接上优化结论吧,

Java内存泄漏问题的排查、优化与最佳实践

《Java内存泄漏问题的排查、优化与最佳实践》在Java开发中,内存泄漏是一个常见且令人头疼的问题,内存泄漏指的是程序在运行过程中,已经不再使用的对象没有被及时释放,从而导致内存占用不断增加,最终... 目录引言1. 什么是内存泄漏?常见的内存泄漏情况2. 如何排查 Java 中的内存泄漏?2.1 使用 J

Java 字符数组转字符串的常用方法

《Java字符数组转字符串的常用方法》文章总结了在Java中将字符数组转换为字符串的几种常用方法,包括使用String构造函数、String.valueOf()方法、StringBuilder以及A... 目录1. 使用String构造函数1.1 基本转换方法1.2 注意事项2. 使用String.valu

numpy求解线性代数相关问题

《numpy求解线性代数相关问题》本文主要介绍了numpy求解线性代数相关问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 在numpy中有numpy.array类型和numpy.mat类型,前者是数组类型,后者是矩阵类型。数组

Python手搓邮件发送客户端

《Python手搓邮件发送客户端》这篇文章主要为大家详细介绍了如何使用Python手搓邮件发送客户端,支持发送邮件,附件,定时发送以及个性化邮件正文,感兴趣的可以了解下... 目录1. 简介2.主要功能2.1.邮件发送功能2.2.个性签名功能2.3.定时发送功能2. 4.附件管理2.5.配置加载功能2.6.

解决systemctl reload nginx重启Nginx服务报错:Job for nginx.service invalid问题

《解决systemctlreloadnginx重启Nginx服务报错:Jobfornginx.serviceinvalid问题》文章描述了通过`systemctlstatusnginx.se... 目录systemctl reload nginx重启Nginx服务报错:Job for nginx.javas

Redis缓存问题与缓存更新机制详解

《Redis缓存问题与缓存更新机制详解》本文主要介绍了缓存问题及其解决方案,包括缓存穿透、缓存击穿、缓存雪崩等问题的成因以及相应的预防和解决方法,同时,还详细探讨了缓存更新机制,包括不同情况下的缓存更... 目录一、缓存问题1.1 缓存穿透1.1.1 问题来源1.1.2 解决方案1.2 缓存击穿1.2.1

vue解决子组件样式覆盖问题scoped deep

《vue解决子组件样式覆盖问题scopeddeep》文章主要介绍了在Vue项目中处理全局样式和局部样式的方法,包括使用scoped属性和深度选择器(/deep/)来覆盖子组件的样式,作者建议所有组件... 目录前言scoped分析deep分析使用总结所有组件必须加scoped父组件覆盖子组件使用deep前言

解决Cron定时任务中Pytest脚本无法发送邮件的问题

《解决Cron定时任务中Pytest脚本无法发送邮件的问题》文章探讨解决在Cron定时任务中运行Pytest脚本时邮件发送失败的问题,先优化环境变量,再检查Pytest邮件配置,接着配置文件确保SMT... 目录引言1. 环境变量优化:确保Cron任务可以正确执行解决方案:1.1. 创建一个脚本1.2. 修