(其實是啟發式**?大霧
題目大意: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,這次...