方隊 啟發式合併 主席樹

2021-08-28 05:53:55 字數 3372 閱讀 2578

(其實是啟發式**?大霧

題目大意:n名同學要進行一次方隊展示。方隊展示的全過程如下:初始時,所有同學站成一橫行,從左到右第i名同學編號為i,身高為ai。然後,所有同學按照一定的順序依次出隊,第i名出隊的同學編號為bi。每名同學出隊後,原先該同學所在的這一行會進行「變隊形」操作:原先在該同學左側的同學位置不動,在右側的同學整體移動到隊伍最後方組成新的一行,並保持他們的相對位置不變,其效果是原先的這一行**成了兩行(注意這兩行均有可能為空)。變隊形前後所有同學的編號和身高不變。在同學們看來,從左往右身高依次遞增的隊形是最美觀的。因此他們定義某一行的「不美觀度」如下:設這一行有k名同學,第i名同學的身高為qi,則其「不美觀度」為有序數對(i,j)的數量,滿足1<=iqj。特別地,若k=0或k=1,則這一行的「不美觀度」為0。現在,你需要幫助同學們求出:每名同學出隊之前,方隊中「不美觀度」最大的一行的「不美觀度」是多少。

題解:每次**的時候暴力掃瞄小的一邊更新答案,通過加入主席樹區間詢問若當前節點和為0則return掉、維護ans的堆的時候0不要push進去、如果當前答案是0那麼之後答案也是0、求區間左右端點不要lowerbound兩次而是先求一次然後it++、最後乙個優化時求區間逆序對的時候如果區間比較小就採取暴力(因為常數小),這樣就能足夠快了。

// luogu-judger-enable-o2

#include

#include

#include

#include

#include

#include

#include

#define gc getchar()

#define lint long long

#define mp make_pair

#define fir first

#define sec second

#define inf (llong_min/100)

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

#define n 100010

#define debug(x) cerr<<#x<<"="<#define sp <<" "

#define ln typedef pair<

int,lint> pili;

typedef set spili;

typedef spili:

:iterator spilit;

inline

intinn()

int a[n]

,n;spili ps;multiset ans;

struct segment

*t[n]

;int

build

(segment*

&rt,

int l,

int r)

intupdate

(segment*

&x,segment*

&y,int p,

int v,

int l,

int r)

lint query

(segment*

&rt,

int s,

int t,

int l,

int r)

int b1[55]

,b2[55]

;inline lint query

(int l,

int r,

int s,

int t)

inline lint calca

(int l,

int r)

lint ans=

0ll;

rep(i,l,r) ans+

=query

(i+1

,r,1

,a[i]-1

);return ans;

}inline lint calcb1

(int l,

int r,

int s,

int t)

lint ans=0;

rep(i,l,r) ans+

=query

(s,t,

1,a[i]-1

);return ans;

}inline lint calcb2

(int l,

int r,

int s,

int t)

lint ans=0;

rep(i,s,t) ans+

=query

(l,r,a[i]+1

,n);

return ans;

}char ss[n*22]

,tt[20]

;int ssl,ttl;

inline

intshow

(lint x)

intmain()

spilit pre=

--ps.

lower_bound(mp

(p,0))

,nxt=pre;nxt++

;int l=pre->fir+

1,r=nxt->fir-

1,lsz=p-l+

1,rsz=r-p;

//[l,p],(p,r]

if(lszcalca

(l,p)

,b=calcb1

(l,p,p+

1,r)

,c=pre->sec-a-b;

else c=

calca

(p+1

,r),b=

calcb2

(l,p,p+

1,r)

,a=pre->sec-b-c;

a-=query

(l,p-

1,a[p]+1

,n),b-

=query

(p+1

,r,1

,a[p]-1

);(pre->sec?ans.

erase

(ans.

find

(-pre->sec)),

0:0)

,(a?ans.

insert

(-a),0

:0),

(c?ans.

insert

(-c),0

:0),

ps.erase

(pre)

,ps.

insert(mp

(l-1

,a))

,ps.

insert(mp

(p,c));

}return

fwrite

(ss+1,

sizeof

(char

),ssl,

stdout),

0;}

bzoj 3123(主席樹 啟發式合併)

傳送門 題解 對點到根維護權值線段樹,每次連邊就進行啟發式合併 用size啟發 詢問就按區間第k大的方式詢問,此處不再贅述。吐槽三點 1.說好的多組資料其實只有一組,醉了。2.1e9的資料按理說是需要離散化的,但是離散化了反而要re 可能是個人原因 3.這個 片的int為啥是畸形的。include ...

啟發式合併

啟發式合併 暴力合併 將兩個資料結構合併,只需要將小的資料結構中的元素乙個乙個的插入大的資料結構o n o n o n 如果題目只有插入操作沒有 總o n logn o nlogn o nlog n 因為每次合併,所有資料結構總大小為n,設兩個資料結構大小為a,b a b a,b a b a,b a...

啟發式合併

includeconst int n 5e5 5 int f n d n r n p n int find int i int unionn int i,int j int main 並查集 按秩啟發式合併 bzoj4668 冷戰 題目大意 給出n個軍工廠和m 個操作,操作分為兩類 0 u v,這次...