NOIP模擬 排列 權值線段樹

2021-08-10 07:42:36 字數 978 閱讀 7044

題目大意:

對於乙個1到n的排列,若知道每一位的逆序數(第i位a[i]的逆序數就是a[1]~a[i-1]中比a[i]大的數的個數),則能求出原排列。

現在對於排列,給出。p[i]表示a[1]~a[i]的逆序數和。請你求出原排列。(1<=n<=100000)

解題思路:

先求出每個數的逆序數,仍設為p[i],倒著確定,那對於最後乙個未確定的數a[i]來說,它前面有p[i]個比它大的數,所以他就是剩下未確定的中的第i-p[i]小的數,用權值線段樹維護即可。

#include

#include

#include

#include

#include

#include

#include

#include

#define ll long long

using namespace std;

int getint()

ll getll()

const int n=100005;

int n,a[n],tr[n<<2];

ll p[n];

void build(int k,int l,int r)

int mid=l+r>>1;

build(k<<1,l,mid),build(k<<1|1,mid+1,r);

tr[k]=tr[k<<1]+tr[k<<1|1];

}int query(int k,int l,int r,int num)

int mid=l+r>>1,res;

if(num<=tr[k<<1])res=query(k<<1,l,mid,num);

else res=query(k<<1|1,mid+1,r,num-tr[k<<1]);

tr[k]=tr[k<<1]+tr[k<<1|1];

return res;

}int main()

權值線段樹

維護全域性的值域資訊,每個節點記錄的是該值域的值出現的總次數。使用二分的思想 離散化的時候,需要用到 支援查詢全域性k小值,全域性rank,前驅,後繼等。單詞操作時間複雜度為o logn 空間複雜度為o n 相對於平衡樹的優勢 簡單,速度快 劣勢 值域較大時,我們需要離散化,變成離線資料結構 我認為...

權值線段樹

include using namespace std int n,m,tre 10003 4 laz 10003 4 void pushdown int num void update int num,int le,int ri,int x,int y,int z pushdown num int...

權值線段樹

權值線段樹是線段樹的一種,但是它與線段樹不同 線段樹的每個結點是用來維護一段區間的最大值或總和 而權值線段樹的每個結點儲存的一段區間有多少個數 權值線段樹主要用來查詢區間第k大或者第k小的值 現在有乙個陣列x 10 對陣列排序後為x 10 每個數的個數如下 1 32 2 3 24 1 5 18 1 ...