pat顶级1027 Larry and Inversions (35 分)

2023-10-06 14:59
文章标签 顶级 pat 35 1027 larry inversions

本文主要是介绍pat顶级1027 Larry and Inversions (35 分),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

欢迎访问我的pat顶级题解目录哦

题目描述

pat顶级1027 Larry and Inversions (35 分)题目描述

算法设计

可以利用树状数组来解决这个问题。
由于n不会超过 1 0 3 10^3 103 ,因此我们可以开辟一个长1005的树状数组c。设计getSum(x)函数表示1到x这些数字在序列中出现次数之和。设计update函数用于更新数字出现次数。
首先我们要明白如果我们定义A[i]左侧比A[i]大的数字个数为S[i],那么对于序列A[i]~A[j],其逆序数为 ∑ k = i j S k \sum _{k=i}^j S_k k=ijSk。我们可以通过树状数组求解A[i]左侧比A[i]大的数字个数,进而可以求解一个序列的逆序数。建立一个二维数组ans,存储每个区间的逆序数,即ans[i][j]表示序列A[i]~A[j]的逆序个数。
接下来,假设我们求得序列A[i]~A[j]的逆序数为ans[i][j],由于序列A[i]~A[j]任选两个数的情况数为 C j − i + 1 2 = ( j − i + 1 ) ( j − i ) 2 C_{j-i+1}^2=\frac {(j-i+1)(j-i)} 2 Cji+12=2(ji+1)(ji),那么将序列A[i]~A[j]翻转后的逆序数就为 C j − i + 1 2 − a n s [ i ] [ j ] C_{j-i+1}^2-ans[i][j] Cji+12ans[i][j]
如果我们求得序列A[1]~A[n]的逆序数为ans[1][n],那么对于任意的 1 ≤ i ≤ n , i ≤ j ≤ n 1 \leq i \leq n, i \leq j \leq n 1in,ijn,将序列A[i]~A[j]翻转后的逆序数K应该为:
K = a n s [ 1 ] [ n ] − a n s [ i ] [ j ] + C j − i + 1 2 − a n s [ i ] [ j ] = a n s [ 1 ] [ n ] − 2 ∗ a n s [ i ] [ j ] + ( j − i + 1 ) ( j − i ) 2 K=ans[1][n]-ans[i][j]+C_{j-i+1}^2-ans[i][j]=ans[1][n]-2*ans[i][j]+\frac {(j-i+1)(j-i)} 2 K=ans[1][n]ans[i][j]+Cji+12ans[i][j]=ans[1][n]2ans[i][j]+2(ji+1)(ji)

C++代码

#include <bits/stdc++.h>
using namespace std;
auto lowbit = [](int x) { return x & (-x); };
vector<int> c(1005);
void update(int x, int v) {for (int i = x; i < c.size(); i += lowbit(i))c[i] += v;
}
int getSum(int x) {int sum = 0;for (int i = x; i > 0; i -= lowbit(i))sum += c[i];return sum;
}
int main() {int n, a;cin >> n;vector<int> A(n + 1);for (int i = 1; i <= n; ++i)cin >> A[i];int ans[n + 1][n + 1] = {};for (int i = 1; i <= n; ++i) {fill(c.begin(), c.end(), 0);for (int j = i; j <= n; ++j) {update(A[j], 1);ans[i][j] = ans[i][j - 1] + j - i + 1 - getSum(A[j]);}}for (int i = 1; i <= n; ++i) {for (int j = i; j <= n; ++j) {int k = ans[1][n] - 2 * ans[i][j] + (j - i) * (j - i + 1) / 2;cout << k << (i == n && j == n ? "" : " ");}}return 0;
}

这篇关于pat顶级1027 Larry and Inversions (35 分)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

『功能项目』战士的平A特效【35】

我们打开上一篇34武器的切换实例的项目, 本章要做的事情是在战士的每次按A键时在指定位置生成一个平A特效 首先将之前下载的技能拖拽至场景中 完全解压缩后重命名为AEffect 拖拽至预制体文件夹 进入主角动画的战士动画层级 双击第一次攻击 选择Animation 创建事件 创建的动画事件帧放在攻击动画挥剑指定处 命名为PerpetualAtt

【SGU】180. Inversions(归并排序求逆序数)

以前一般用树状数组和线段树做这种题 这次换个思路试试,归并排序! #include<cstdio>#include<cstring>#include<algorithm>using namespace std;typedef long long LL;const int maxn = 111111;int n;int array[maxn];int tmp[maxn];L

NoSQL数据库的35个应用场景

现在我们站在各个用例的角度上来考虑那种系统适合于这些用例。   你的意见是?   首先,我们要纵览各种数据模型。这些模型的分类方法来自于Emil Eifrem和NoSQL databases。   文档数据库   源起:受Lotus Notes启发。   数据模型:包含了key-value的文档集合   例子:CouchDB, MongoDB   优点:数据模型自然,编

印度再现超级大片,豪华阵容加顶级特效

最近,印度影坛再次掀起了风潮,一部名为《毗湿奴降临》的神话大片强势登陆各大影院,上映首周票房就飙升至105亿卢比,成功占据了票房榜首的位置。之后,这部电影也在北美上映,海外市场的表现同样不俗,收获了相当亮眼的票房成绩。作为一部印度神话科幻大片,《毗湿奴降临》不仅在本土大火,在国际市场上也引发了不小的关注。 《毗湿奴降临》由印度著名导演纳格·阿什温执导,卡司阵容极其豪华,集结了迪皮卡·帕度柯妮

JD 1027:欧拉回路

OJ题目:click here~~ 题目分析: 若图G中存在这样一条路径,使得它恰通过G中每条边一次,则称该路径为欧拉路径。若该路径是一个圈,则称为欧拉(Euler)回路。 具有欧拉路径的图称为欧拉图(简称E图)。 无向图存在欧拉回路的充要条件: 一个无向图存在欧拉回路,当且仅当该图拥有奇数度数的顶点的个数为0且该图是连通图。 有向图存在欧拉回路的充要条件: 一

什么是顶级域名后缀?

在互联网发展的历程中,顶级域名(Top-Level Domain,简称TLD)扮演着至关重要的角色。而这些顶级域名的后缀,则更是成为了整个网络世界的分类标准和识别依据。 顶级域名后缀,通常指位于域名最右端的部分,如".com"、“.org”、".cn"等。它们为下层的二级域名和三级域名提供了一个基础的分类框架,让互联网上的各类网站、组织和个人能够根据自身特点选择合适的域名后缀。 不同类型的顶级

PAT甲级-1044 Shopping in Mars

题目   题目大意 一串项链上有n个钻石,输入给出每个钻石的价格。用m元买一个连续的项链子串(子串长度可为1),如果不能恰好花掉m元,就要找到最小的大于m的子串,如果有重复就输出多个,按递增顺序输出子串的前端和后端索引。 原来的思路 取连续的子串使和恰等于m,没有恰等于就找最小的大于。可以将子串依次累加,使得每个位置都是起始位置到该位置的序列和,整个数组显递增顺序,就可以用右边减左边

Apache顶级项目Ambari正式宣告退役!

点击上方蓝色字体,选择“设为星标” 回复”面试“获取更多惊喜 截止本文发稿时,Apache Ambari官网正式宣告该项目退役。 截止本文发稿时,Apache Ambari官网正式宣告该项目退役。 This project has retired. Apache Ambari 是一个基于 Web 的 Apache Hadoop 集群的供应、管理和监控工具,曾是 Apache Soft

推荐几个顶级数据学习平台

今天分享几位资深大佬,他们都是数据领域的顶级专家,大家可以根据需要按需关注。 进击吧大数据 从事大数据行业多年,涉及范围包括基础支撑、计算引擎、数据整合、数据应用等方向。《大数据技术架构手册》编制者,目前带领团队建设实时数仓及主导数据治理。 一册在手,走遍天下(大数据技术架构手册之上篇十四万字问世) 大数据架构师 老彭,数字化老兵,历任多家公司大数据总监,仅代表个人观点。公众号分享大量干货,包括

PAT (Advanced Level) Practice——1011,1012

1011:  链接: 1011 World Cup Betting - PAT (Advanced Level) Practice (pintia.cn) 题意及解题思路: 简单来说就是给你3行数字,每一行都是按照W,T,L的顺序给出相应的赔率。我们需要找到每一行的W,T,L当中最大的一个数,累乘的结果再乘以0.65,按照例子写出表达式即可。 同时还需要记录每一次选择的是W,T还是L