bzoj2141 排隊 cdq分治

2022-05-01 13:39:06 字數 1353 閱讀 9261

和動態逆序對有些類似  這題既可以以時間為第一維 也可以以x軸維第一維度   具體視題目而定

cdq分治只能求點對之間的影響  如果要變成整個序列的情況  那麼可以用字首和   一開始的原序列的id設定成0即可   

#includeusing

namespace

std;

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

#define repp(i,a,b) for(int i=(a);i>=(b);--i)

#define ll long long

#define see(x) (cerr<

#define clr(a,v) memset(a,v,sizeof a)

///////////////////////////////////////

const

int n=1e5+10

;int n,m,t[n+200

],cnt,a[n],b[n];

ll ans[n];

void add(int x,int v)

int qsum(int x)

struct nodes[n];

bool cmp(node a,node b)

void cdq(int l,int

r)

while(--j>=l)add(s[j].y,-s[j].w);

j=mid;

repp(i,r,mid+1

)

while(++j<=mid)add(s[j].y,-s[j].w);

}int

main()

; }

sort(b+1,b+1+n);

int nn=unique(b+1,b+1+n)-b-1

; rep(i,

1,n)a[i]=lower_bound(b+1,b+1+nn,a[i])-b,

s[i].y=lower_bound(b+1,b+1+nn,s[i].y)-b;

cin>>m;

rep(i,

1,m)

;s[++cnt]=(node);

s[++cnt]=(node);

s[++cnt]=(node);

swap(a[x],a[y]);

}cdq(

1,cnt);

rep(i,

1,m)

ans[i]+=ans[i-1

]; rep(i,

0,m)printf("

%lld\n

",ans[i]);

return0;

}

view code

BZOJ 2141 排隊 CDQ分治

題意 交換序列中兩個元素,求逆序對 做分塊做到這道題.一看不是三維偏序嘛.作為不會樹套樹的蒟蒻就寫cdq分治吧.對時間分治.x排序.y樹狀陣列.交換拆成兩個插入兩個刪除,儲存一下型別就行了 才發現逆序對問題的刪除操作不用時間倒流也可以,直接減去它形成的逆序對數並且在樹狀陣列中刪除就可以了 然後愚蠢的...

BZOJ 2141 排隊 分塊 Treap

排排坐,吃果果,生果甜嗦嗦,大家笑呵呵。你乙個,我乙個,大的分給你,小的留給我,吃完果果唱支歌,大家樂和和。紅星幼兒園的小朋友們排起了長長地隊伍,準備吃果果。不過因為小朋友們的身高有所區別,排成的隊伍高低錯亂,極不美觀。設第i個小朋友的身高為hi,我們定義乙個序列的雜亂程度為 滿足ihj的 i,j ...

分塊入門 bzoj2141排隊

to infinity and beyond.wall e 首先可以用離散化 樹狀陣列來計算逆序對個數 時間複雜度 n log n 對於有關逆序對的題目,首先可以想到逆序對的特質 然後對於每個詢問 x,y xa i a i a x ans a i a i a y ans 此時想到用分塊處理 對於n個...