首页 > 其他分享 >关于逆序对的一些整理

关于逆序对的一些整理

时间:2023-03-08 20:46:01浏览次数:45  
标签:ai sum tree long 关于 数组 整理 逆序

1.求逆序对的方法:树状数组,O(nlog)的复杂度

 

树状数组功能:用log的复杂度求出一个数组里面所有大于某一个数字的和,即sum=a1+a2+。。。。+an,其中a1。。an全都小于目标值x

做法:对于数组元素ai来说,他的逆序对个数是i前面的所有比ai大的数字,但应为树状数组只能找前面n个数字的和,即找比ai小的数字,因此可以先把a数组倒过来,这样就是求ai这个数字前面比他

小的数字有几个,就是逆序对个数

 

逆序对的一些定理:

  1.对于一个数组来说,如果交换其相邻两个元素,整个数组的逆序对个数的奇偶性会反转,即只有逆序对个数+1或-1两种情况

  2.对于1--n的任意排列,交换其中任意两个元素即可让其奇偶性发生反转

  证明:假如选定数组a中的ai跟aj两个元素,由定理1得,可以用2m+1次(m为i和j的距离)相邻元素之间的交换达到该两个元素互换的目的。因此定理成立。

 

例题:D-tokitsukaze and Inverse Number_牛客练习赛33 (nowcoder.com)

代码实现:

#include <bits/stdc++.h>
using namespace std;
const long long maxx = 0x3f3f3f3f3f3f3f3f;
const long long minn = 0xc0c0c0c0c0c0c0c0;
const double pi = 4.0 * atan(1.0);
#define int long long
#define f(i, n, m) for (long long i = n; i <= m; ++i)
#define unf(i, n, m) for (long long i = n; i >= m; --i)
#define kong NULL
#define debug cout << "sss" << endl;

int n;
int lowbit(int x)
{
    return (x & -x);
}
void add(int x, int v, vector<int> &tree)
{
    while (x <= n)
    {
        tree[x] += v;
        x += lowbit(x);
    }
}
int query(int x, vector<int> &tree)
{
    int sum = 0;
    while (x >= 1)
    {
        sum += tree[x];
        x -= lowbit(x);
    }
    return sum;
}
void solve()
{

    cin >> n;
    vector<int> que((n<<2 )+10, 0);
    vector<int> tree((n<<2 )+10, 0);
    int zhi = 0;
    f(i, 1, n)
    {
        cin >> que[i];
    }
    unf(i, n, 1)
    {
        add(que[i], 1, tree);
        zhi += query(que[i] - 1, tree);
    }
    // cout << zhi << endl;

    int m;
    cin >> m;
    f(i, 1, m)
    {
        int l, r, k;
        cin >> l >> r >> k;
        zhi%=2;
         if(((r-l)&k&1)==1)zhi^=1;
        cout << zhi  << endl;
    }
}

signed main()
{
    ios::sync_with_stdio(false);
//     int _;
//     cin >> _;
//     while (_--)
//     {
//         solve();
//     }
     solve();
    return 0;
}

 

标签:ai,sum,tree,long,关于,数组,整理,逆序
From: https://www.cnblogs.com/shifangchen/p/17196184.html

相关文章

  • 关于prop传参可不可以更改的问题
    首先列举平常使用Vue父组件传递数据到子组件的几种情况传递的是基础数据类型(Number,Boolean,String)传递的是引用类型(Object,Array)结论当传给子组件的Prop为基本数据类......
  • 关于docker中-镜像IMAGE的管理-删除操作
    可以使用dockerimages列出镜像,看到可以在加上-a列出中间层镜像[root@qq-5201351~]#dockerimagesREPOSITORYTAGIMAGEIDCREATEDSIZEnginx......
  • 关于Android事件分发的设计模式理解与思考
    关于Android事件分发的设计模式理解与思考在现在Android智能机上,触碰几乎成为了唯一的交互方式。那么触碰消息在Android系统当中怎么进行分发的呢?在事件分发处理上,Androi......
  • leetcode刷题--两数之和/两数相加/关于class/enumerate()函数/TypeError: creat() mis
    Python中的self详细解析-初识CV的文章-知乎https://zhuanlan.zhihu.com/p/356325860关于classleetcode里面给出的class部分是不能删除的,否则会执行出错。关于class......
  • 51Nod1019 逆序数(归并排序详解)
    逆序对给定一个1-N的排列A1,A2,...AN,如果Ai和Aj满足i<j且Ai>Aj,我们就称(Ai,Aj)是一个逆序对。 求A1,A2...AN中所有逆序对的数目。input 第一行包含一个整数N......
  • 关于信息安全风险评估,一文讲清楚了
    什么是信息安全风险评估?信息安全风险评估是参照风险评估标准和管理规范,对信息系统的资产价值、潜在威胁、薄弱环节、已采取的防护措施等进行分析,判断安全事件发生的概率以及......
  • 关于docker中-容器的管理操作-删除
    在docker中,我们知道,可以通过镜像images创建容器,今天主要讲一下容器的管理操作-容器的删除说明:要删除docker镜像,需要先将引用镜像的容器先删除了,其中包含运行的和非运行状......
  • 关于redis的击穿,穿透,雪崩
    Redis提供了一些技术手段来防止缓存击穿、缓存雪崩和缓存穿透,这些技术手段包括:缓存击穿缓存击穿是指一个不存在于缓存中的key,每次访问时都会穿透到数据库,导致数据库负......
  • 关于 Spartacus 新的交付方式 RBSC 和用到的一些工具
    JFrog是一家软件公司,提供了一系列的工具和技术,帮助开发者和组织更高效地管理软件开发、交付和部署的整个生命周期。JFrog的产品主要包括Artifactory、Xray、Pipelines、Dist......
  • 关于 SAP UI5 MessageProcessor 消息创建的问题
    我们在单步调试SAPUI5OData模型或者JSON模型初始化代码时,都会发现sap.ui.model.Model构造函数调用了其基类MessageProcessor的构造函数,如下图所示:MessageProces......