BZOJ3295 動態逆序對(樹狀陣列套線段樹)

2022-05-18 07:25:51 字數 1413 閱讀 1032

time limit: 10 sec  memory limit: 128 mb

submit: 6058  solved: 2117

[submit][status][discuss]

對於序列a,它的逆序對數定義為滿足i

>aj

的數對(i,j)的個數。給1到n的乙個排列,按照某種順序依次刪除m個元素,你的任務是在每次刪除乙個元素之前統計整個序列的逆序對數。

輸入第一行包含兩個整數n和m,即初始元素的個數和刪除的元素個數。以下n行每行包含乙個1到n之間的正整數,即初始排列。以下m行每行乙個正整數,依次為每次刪除的元素。

輸出包含m行,依次為刪除每個元素之前,逆序對的個數。

5 4153

4251

4252

21樣例解釋

(1,5,3,4,2)(1,3,4,2)(3,4,2)(3,2)(3)。

n<=100000 m<=50000

題解:普通的樹狀陣列,無法記錄位置,不能知道一次之後記錄的是所以位置的資訊,

一次刪除的時候,不能知道哪些值是比它小的,因為位置的影響,

所以需要樹套樹,在開一層位置,這樣就可以了,動態開點,n logn log n的空間複雜度。

1 #include2 #include3 #include4 #include5 #include6

7#define n 100007

8#define m 10000007

9using

namespace

std;

10int

n,m,cnt;

11int

a[n],id[n],bit[n],lson[m],rson[m],tree[m];

12long

long

ans;

1314

int lowbit(int x)

15void addy(int &u,int l,int r,int x,int

y)16

19int mid=(l+r)>>1;20

if(x<=mid) addy(lson[u],l,mid,x,y);

21else addy(rson[u],mid+1

,r,x,y);

22 tree[u]=tree[lson[u]]+tree[rson[u]];23}

24void addx(int x,int y,int

val)

2529

int queryy(int u,int l,int r,int i,int

j)30

38int queryx(int x,int l,int

r)39

45int

main()

4655

while(m--)

5664 }

bzoj3295 動態逆序對

portal bzoj3295 雖然說這個可能原本是一道愉快的樹套樹但是 看到 按照某個順序依次刪除 這樣的字眼,比較容易聯想到乙個套路 反過來看,變成按照某個順序依次插入 那麼對於乙個詢問,刪掉它之前 化完了之後就是插入它之後 的所會影響到的逆序對數可以分為兩種 一種是在它前面但是比它大的,一種是...

BZOJ3295 動態逆序對

問題描述 對於序列a,它的逆序對數定義為滿足i j,且ai aj的數對 i,j 的個數。給1到n的乙個排列,按照某種順序依次刪除m個元素,你的任務是在每次刪除乙個元素之前統計整個序列的逆序對數。輸入格式 輸入第一行包含兩個整數n和m,即初始元素的個數和刪除的元素個數。以下n行每行包含乙個1到n之間的...

bzoj3295 動態逆序對(CDQ分治)

time limit 10 sec memory limit 128 mb submit 7178 solved 2548 submit status discuss 對於序列a,它的逆序對數定義為滿足iaj的數對 i,j 的個數。給1到n的乙個排列,按照某種順序依次刪 除m個元素,你的任務是在每次...