bzoj3289 Mato的檔案管理

2021-07-10 06:07:15 字數 1190 閱讀 8356

給定乙個序列,每次詢問乙個區間,你可以交換相鄰兩個元素,這個區間你最少需要多少次交換才能使其有序。

我們觀察,每次交換如果交換a[i]和a[i+1],那麼顯然a[i]>a[i+1],交換後逆序對個數減一。當序列逆序對個數為0時序列就有序。那麼顯然題意就是詢問區間逆序對個數。我們可以用莫隊演算法來做。因為它符合類似+1-1的性質。

#include

#include

#include

#define fo(i,a,b) for(i=a;i<=b;i++)

using namespace std;

const int maxn=50000+10;

int tree[maxn*5],belong[maxn],a[maxn],b[maxn],ans[maxn];

struct dong;

dong ask[maxn];

int i,j,k,l,r,t,n,m,c,now,top;

bool cmp(dong a,dong b)

void change(int p,int l,int r,int a,int b)

int mid=(l+r)/2;

if (a<=mid) change(p*2,l,mid,a,b);else change(p*2+1,mid+1,r,a,b);

tree[p]=tree[p*2]+tree[p*2+1];

}int query(int p,int l,int r,int a,int b)

int main()

c=floor(sqrt(n)+1);

fo(i,1,n) belong[i]=(i-1)/c+1;

sort(ask+1,ask+m+1,cmp);

l=r=1;

change(1,1,top,a[1],1);

fo(i,1,m)

while (l>ask[i].l)

while (r1,1,top,a[r]+1,top);

change(1,1,top,a[r],1);

}while (r>ask[i].r)

ans[ask[i].id]=now;

}fo(i,1,m) printf("%d\n",ans[i]);

fclose(stdin);fclose(stdout);

return

0;}

bzoj 3289 Mato的檔案管理

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

bzoj3289 Mato的檔案管理

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

bzoj 3289 Mato的檔案管理

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