HYSBZ3295 動態逆序對

2021-08-04 03:30:03 字數 2267 閱讀 4987

time limit: 10 sec  

memory limit: 128 mb

submit: 5029  

solved: 1686 [

submit][

status][

discuss]

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

>aj

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

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

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

5 415

3425

1425

221樣例解釋

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

n<=100000 m<=50000

解題思路:把刪除變成倒著插入,給每個座標乙個權值t,表示插入時間。那麼第乙個刪除的t座標當然是n,表示最後乙個插入。把未被刪除的結點的t座標從左往右設為1、2、3……那麼問題就變成了求對於(t0,x0,y0)滿足ty0或滿足tx0,y首先cdq分治之前按t排序,保證t已經有序,在每次分治內部,按x排序,正著掃整個區間的時候,對於[mid+1,r]的區間就在樹狀陣列上查詢大於他的y的值的數量;倒著掃,對於[mid+1,r]的區間就在樹狀陣列上查詢小於他的y的值的數量。因為左邊的所有元素對於右邊的所有元素而言,是可以肯定t小的

這題也可以用樹套樹的方法解決,同樣是把刪除變成倒著插入

cdq分治:

#include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std;

#define ll long long

const int inf = 0x3f3f3f3f;

int n, m, pos[100005], x[100005];

ll ans[100005];

struct node

a[100005];

bool cmpt(node a, node b)

bool cmp(node a, node b)

int lowbit(int k)

void update(int k, int val)

int getsum(int k)

void cdq(int l, int r)

for (j--; j >= l; j--) update(a[j].v, -1);

j = mid;

for (int i = r; i >= mid + 1; i--)

for (j++; j <= mid; j++) update(a[j].v, -1);

}int main()

return 0;

}

樹套樹:

#include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std;

#define ll long long

#define n 100003

const int inf = 0x3f3f3f3f;

int a[n], n, q, tot, s[n], b[n], x[n], flag[n];

int l[n * 100], r[n * 100], sum[n * 100];

ll ans[n];

int lowbit(int x)

void add(int &k, int l, int r, int p, int val)

void update(int k, int p, int val)

ll get(int k, int l, int r, int ll, int rr)

ll query(int k, int l, int r)

int main()

for (int i = 1; i <= q; i++) printf("%lld\n", ans[i]);

return 0;

}

BZOJ P3295 動態逆序對

bzoj yzoj 我們可以預處理出每乙個點所包含的逆序對數k i 刪除的時候把這個值減去就可以了。問題在於之前的操作可能已經把當前要減去的逆序對數包含了。考慮乙個操作序列。在當前對答案減去k i 後,只需加上當前點與之前操作刪掉的點存在的逆序對數就好了。我們知道當前操作為a,滿足操作b在a之前,b...

bzoj3295 動態逆序對

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

BZOJ3295 動態逆序對

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