首页 > 其他分享 >P1908 逆序对

P1908 逆序对

时间:2024-08-23 16:28:42浏览次数:6  
标签:rt P1908 int res query INF 逆序

P1908 逆序对

跟用树状数组求如出一辙,但是它可以不离散化直接求解,因为它可以直接把区间传到函数里,正负无所谓,反正是动态开点,此题作为动态开点的演示。

这种线段树十分耗费空间。

#include<iostream>
using namespace std;
const int M=15000010,INF=1e9;//M是理论值,远远达不到
int n,v[M],rt,l[M],r[M],idx;
typedef long long ll;
ll ans;
void pushup(int p){
	v[p]=v[l[p]]+v[r[p]];
}
int query(int &p,int ql,int qr,int L,int R){
	if(!p)p=++idx;
	if(ql<=L&&R<=qr)return v[p];
	int mid=L+R>>1,res=0;
	if(ql<=mid)res=query(l[p],ql,qr,L,mid);
	if(qr>mid)res+=query(r[p],ql,qr,mid+1,R);
	return res;
}
void modify(int &p,int L,int R,int x){
	if(!p)p=++idx;
	if(L==R){
		++v[p];
		return;
	}
	int mid=L+R>>1;
	if(x<=mid)modify(l[p],L,mid,x);
	else modify(r[p],mid+1,R,x);
	pushup(p);
}
int main(){
	#ifdef LOCAL
	freopen("1.txt","r",stdin);
	#endif
	#ifndef LOCAL
	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0);
	#endif
	cin>>n;
	for(int i=1;i<=n;++i){
		int a;
		cin>>a;
		ans+=query(rt,a+1,INF,1,INF);
		modify(rt,1,INF,a);
	}
	cout<<ans;
	return 0;
}

标签:rt,P1908,int,res,query,INF,逆序
From: https://www.cnblogs.com/wscqwq/p/18376326

相关文章

  • 让程序既能正序也能逆序显示电影列表。使用双向链表
    /让程序既能正序也能逆序显示电影列表。使用双向链表/#include<stdio.h>#include<stdlib.h>#include<string.h>typedefstructMovie{chartitle[100];structMovie*prev;structMovie*next;}Movie;typedefstructMovieList{Movie*head;......
  • 逆序对数列(P2513) - 题解
    [HAOI2009]逆序对数列原题链接题目描述对于一个数列\(\{a_i\}\),如果有\(i<j\)且\(a_i>a_j\),那么我们称\(a_i\)与\(a_j\)为一对逆序对数。若对于任意一个由\(1\simn\)自然数组成的数列,可以很容易求出有多少个逆序对数。那么逆序对数为\(k\)的这样自然数数列到底......
  • 字符串逆序(递归实现)
    题目内容: 编写一个函数reverse_string(char*string)(逆序实现) 实现:将参数字符串中的字符反向排列,不是逆序打印。 要求:不能使用C函数库中的字符串操作函数 比如:char[]="abcdef"   逆序之后是数组内容变成:"fedcba";非函数:#include<stdio.h>intmain(){ ch......
  • StringBuffer的功能,添加、删除、替换、反转(字符串逆序)功能 day11
    packagecom.shujia.day11;/*StringBuffer的功能:添加功能publicStringBufferappend(Stringstr)在末尾处添加字符,返回自身publicStringBufferinsert(intoffset,Stringstr)指定位置添加字符串,返回自身......
  • 数组元素逆序
    /*数组元素逆序(就是把元素对调)涉及数组元素交换的逻辑的时候,可以定义一个中间变量,作用是临时将值存储一下*/publicclassArrayTest3{publicstaticvoidmain(String[]args){int[]arr={1,2,3,4,5,6,7};System.out.println("......
  • 逆序对的数量 - 题解
    逆序对的数量时间限制:C/C++1000MS,其他语言2000MS内存限制:C/C++64MB,其他语言128MB描述给定一个长度为\(n\)的整数数列,请你计算数列中的逆序对的数量。逆序对的定义如下:对于数列的第\(i\)个和第\(j\)个元素,如果满足\(i<j\)且\(a[i]>a[j]\),则其为一个逆序对;否则......
  • 逆序对的数量 - 题解
    逆序对的数量时间限制:C/C++1000MS,其他语言2000MS内存限制:C/C++64MB,其他语言128MB描述给定一个长度为\(n\)的整数数列,请你计算数列中的逆序对的数量。逆序对的定义如下:对于数列的第\(i\)个和第\(j\)个元素,如果满足\(i<j\)且\(a[i]>a[j]\),则其为一个逆序对;否则......
  • golang 数组转为链表 - 正序和逆序
    有时候,有这样的场景,我们需要就给定数组将其转为一个链表,通常的思路有两种:正序逆序以下是具体的代码实现和测试函数:packagemainimport("fmt""testing")typelistNodestruct{next*listNodevalint}//正序遍历构建链表//通过一个虚拟头结点,不......
  • 788. 逆序对的数量
    给定一个长度为nnn的整数数列,请你计算数列中的逆序对的数量。逆序对的定义如下:对于数列的第iii个和第jjj个元素,如果满足i<ji<ji<j且a[i]>a[j]a[i]>a[j]a[i]>a[j],则其为一个逆序对;否则不是。输入格式第一行包含整数nnn,表示数列的长度。第二行包含n......
  • 三种语言实现计算逆序对的数量(C++/Python/Java)
    题目给定一个长度为......