bzoj 3289 Mato的檔案管理

2021-09-29 08:14:51 字數 1704 閱讀 2427

time limit: 40 sec memory limit: 128 mb

submit: 5104 solved: 2131

[submit][status][discuss]

description

mato同學從各路神犇以各種方式(你們懂的)收集了許多資料,這些資料一共有n份,每份有乙個大小和乙個編號

。為了防止他人偷拷,這些資料都是加密過的,只能用mato自己寫的程式才能訪問。mato每天隨機選乙個區間[l,r

],他今天就看編號在此區間內的這些資料。mato有乙個習慣,他總是從檔案大小從小到大看資料。他先把要看的

檔案按編號順序依次拷貝出來,再用他寫的排序程式給檔案大小排序。排序程式可以在1單位時間內交換2個相鄰的

檔案(因為加密需要,不能隨機訪問)。mato想要使檔案交換次數最小,你能告訴他每天需要交換多少次嗎?

input

第一行乙個正整數n,表示mato的資料份數。

第二行由空格隔開的n個正整數,第i個表示編號為i的資料的大小。

第三行乙個正整數q,表示mato會看幾天資料。

之後q行每行兩個正整數l、r,表示mato這天看[l,r]區間的檔案。

n,q <= 50000

output

q行,每行乙個正整數,表示mato這天需要交換的次數。

sample input

41 4 2 3

1 22 4

sample output

0//樣例解釋:第一天,mato不需要交換

第二天,mato可以把2號交換2次移到最後。

多次求乙個區間的逆序對問題。

每次交換相鄰的元素,把陣列從小到大排序,最小的次數就是逆序對的數量。不難證明。

所以我們就是多次求乙個區間的逆序數,然後區間之間有很多共同計算的,於是我們莫隊暴力+樹狀陣列即可。

ac**:

#pragma gcc optimize(2)

#include

//#define int long long

#define lowbit(x) (x&(-x))

using namespace std;

const

int n=

5e4+10;

int n,q,a[n]

,d[n]

,res[n]

,s,bl,cl=

1,cr,b[n]

;struct nodeq[n]

;int

cmp(node a,node b)

inline

void

add(

int x,

int v)

inline

intask

(int x)

inline

voidad(

int x,

int flag)

inline

void

del(

int x,

int flag)

signed

main()

for(

int i=

1;i<=q;i++

) cout<

}

bzoj3289 Mato的檔案管理

給定乙個序列,每次詢問乙個區間,你可以交換相鄰兩個元素,這個區間你最少需要多少次交換才能使其有序。我們觀察,每次交換如果交換a i 和a i 1 那麼顯然a i a i 1 交換後逆序對個數減一。當序列逆序對個數為0時序列就有序。那麼顯然題意就是詢問區間逆序對個數。我們可以用莫隊演算法來做。因為它符...

bzoj 3289 Mato的檔案管理

description mato同學從各路神犇以各種方式 你們懂的 收集了許多資料,這些資料一共有n份,每份有乙個大小和乙個編號。為了防止他人偷拷,這些資料都是加密過的,只能用mato自己寫的程式才能訪問。mato每天隨機選乙個區間 l,r 他今天就看編號在此區間內的這些資料。mato有乙個習慣,他...

bzoj3289 Mato的檔案管理

description mato同學從各路神犇以各種方式 你們懂的 收集了許多資料,這些資料一共有n份,每份有乙個大小和乙個編號。為了防止他人偷拷,這些資料都是加密過的,只能用mato自己寫的程式才能訪問。mato每天隨機選乙個區間 l,r 他今天就看編號在此區間內的這些資料。mato有乙個習慣,他...