bzoj3289(莫隊 樹狀陣列)

2021-08-21 13:25:02 字數 1632 閱讀 6795

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次移到最後。

hint

source

by taorunz

經典題目。

每次刪除和加入直接在樹狀陣列裡進行統計即可

#include

using namespace std;

int a[50100] , n , q , m;

int tmp[50100];

inttr[50100] , belong[50100];

unsigned int ans,out[50100];

struct data

da[50100];

struct question

q[50100];

intread()

while( c >= '0' && c <= '9' ) sum = sum * 10 + c - 48 , c = getchar();

if(flag) return sum;

else

return -sum;

} unsigned int find(intx)

return sum;

}void add(int

x,int v)

bool mycmp(data a,data b)

bool mycmp1(question a,question b)

void init()

void work()

for(int i = 1;i <= q;++i)

printf("%d\n",out[i]);

return;

}int main()

BZOJ 3289 莫隊 樹狀陣列

題意 問 l,r 區間最少交換幾次相鄰數字使得整個序列有序。思路 統計逆序對,用樹狀陣列。然後跑一遍莫隊。離散化部分容易超時,所以直接修改了陣列。原始碼 include include include include include include include include include u...

BZOJ 3289 莫隊演算法 樹狀陣列

time limit 40 sec memory limit 128 mb submit 1671 solved 732 submit status discuss mato同學從各路神犇以各種方式 你們懂的 收集了許多資料,這些資料一共有n份,每份有乙個大小和乙個編號。為了防止他人偷拷,這些資料都...

莫隊 樹狀陣列 AHOI 作業

3236 ahoi2013 作業 time limit 100 sec memory limit 512 mb submit 1716 solved 690 submit status discuss description input output sample input 3 41 2 2 1 ...