首页 > 其他分享 >逆序对——权值树状数组+离散化

逆序对——权值树状数组+离散化

时间:2023-12-09 23:01:32浏览次数:43  
标签:lan end 树状 int begin 权值 逆序

  • 给定一个长度为 n 的整数数列,请你计算数列中的逆序对的数量。每个数字不超过1e9。
int n, m;
int a[N];
int tr[N];
vector<int>lan;
int lowbit(int x){
	return x&(-x);
}
void discrete()
{
    sort(lan.begin(), lan.end());   //排序
    lan.erase(unique(lan.begin(), lan.end()), lan.end());   //去重
}

//查询
int find(int x)
{
    return lower_bound(lan.begin(), lan.end(), x)-lan.begin()+1;  //返回所查询的数据的下标
}
void add(int x,int c){
	for(int i=x;i<=n;i+=lowbit(i))tr[i]+=c;
}

int query(int x){
	int res=0;
	for(int i=x;i;i-=lowbit(i))res+=tr[i];
	return res;
}
void solve(){
	cin>>n;
	for(int i=1;i<=n;i++)cin>>a[i];
	
	for(int i=1;i<=n;i++)lan.push_back(a[i]);
	discrete();
	int mx=lan.size();
	ll cnt=0;
	for(int i=1;i<=n;i++){
		cnt+=query(mx)-query(find(a[i]));
		add(find(a[i]),1);
	}
	cout<<cnt<<endl;
}

标签:lan,end,树状,int,begin,权值,逆序
From: https://www.cnblogs.com/mathiter/p/17891963.html

相关文章

  • 打工笔记----------------------------跨进程控制SysTreeView32树状图控件的问题
    跨进程控制SysTreeView32树状图控件的问题,啥也不说了,直接上代码:publicpartialclassForm1:Form{//定义常量publicconstintWM_LBUTTONDBLCLK=0x020B;//左键双击消息publicconstintWM_RBUTTONDOWN=0x0204;//右键按下消息......
  • vector的逆序删除
    #include<iostream>#include<vector>#include<set>usingnamespacestd;intmain(){vector<int>test={1,2,2,2,3,4,2,3,2,2,63,2,99,2,2,1};for(autoit=test.rbegin();it!=test.rend();){if(*it==2){//删除值为2的元素intinde......
  • ABC 331 F - Palindrome Query(字符串哈希,树状数组)
    字符串哈希[OI-Wiki](字符串哈希-OIWiki(oi-wiki.org))分为两种哈希方式:以左为高位和以右为高位如果只是快速查询每个字串的哈希值,用以左为高位比较简单,即\[Hash[l...r]=Hash[1...r]-Hash[1...(l-1)]\timesbase^{r-l+1}\]但是如果有修改操作,需要将每一位的Hash值存......
  • 链表K个节点的组内逆序调整问题
    链表K个节点的组内逆序调整问题作者:Grey原文地址:博客园:链表K个节点的组内逆序调整问题CSDN:链表K个节点的组内逆序调整问题题目描述LeetCode25.ReverseNodesink-Group本题的followup是:Follow-up:CanyousolvetheprobleminO(1)extramemoryspace?即用\(O(......
  • 为什么全序集降位和和逆序对在同一长度的排列的分布相同?
    引入在q-analog中,我们知道:\[\sum_{p\inS}q^{\operatorname{maj}(p)}=\sum_{p\inS}q^{\tau(p)}=\binom{\suma_i}{a_1,a_2,\dots,a_n}_q\]其中\(S\)是\(a_i\)个\(i\)元素(对于所有\(i\))构成的排列集合。\[\operatorname{maj}(p)=\sum_{i<\suma_i}i[p_i>p......
  • 树状数组和线段树
    树状数组:1.将某一个数加上k2.求出某区间每一个数的和#include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;lln,m,a[500000+10];lllowbit(llx){returnx&(-x);}voidadd(llx,llk){ while(x<=n){ a[x]+=k; x+=lowbit(x); }}llquery(llx){ ll......
  • 前端项目实战叁佰伍拾陆react-admin和material ui-处理形成树状数据结构2
    dataProviders.getStyleTree('t_prod_category','t_prod_style').then((res:any)=>{console.log(res,"resssssssss")letarr:any=[]letarr1:any=[{key:0,title:"品类管理",......
  • 前端项目实战叁佰伍拾伍react-admin和material ui-处理形成树状数据结构1
    if(data!==undefined){lettemp:ITreeData[]=[{key:'0',title:'工厂管理',children:newArray<ITreeData>()}];//向从数据库查询到的数据中添加Tree结构所需要的字段,key使用id,title使用name;data.forEach(it=>{......
  • loj144&145 dfs序+树状数组/线段树
    https://loj.ac/p/144https://loj.ac/p/145两题非常相似,一题的权值修改是在点上的,一题的权值修改是在整棵子树上的。首先我们要了解dfs序,并记录每个节点的子树大小sz,对于一个节点,在dfs序上sz长的区间全都是他的子节点以及他自己。所以我们将一棵树映射到了一个区间上,并且可......
  • 2维区间树状数组
    voidadd(llx,lly,llz){for(intX=x;X<=n;X+=X&-X)for(intY=y;Y<=m;Y+=Y&-Y){t1[X][Y]+=z;t2[X][Y]+=z*x;t3[X][Y]+=z*y;t4[X][Y]+=z*x......