題目大意:
對於乙個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 ...