BZOJ3956 Count 主席樹 單調棧

2022-05-20 16:01:38 字數 805 閱讀 8644

3 2 0

2 1 2

1 11 303

m,n<=3*10^5,ai<=10^9

題解:影魔那道題的簡化版,依舊用單調棧記錄每個數左(右)邊第乙個比它大的數為ld[i],rd[i],那麼合法的點對只有(i,i+1)和(ld[i],rd[i])兩種。為了防止重複,我們記錄每個數左邊第乙個》=它的數le[i],當且僅當le[i]==ld[i]的時候我們才統計這樣的點對。然後就變成了在乙個二維平面內有一些點,每次問你乙個矩形中點的個數,用主席樹就行了。

但是自從觀摩了單調棧+st表的做法後感覺自己的做法爛成渣~

#include #include #include using namespace std;

const int maxn=300010;

int n,m,typ,ans,tot,top,cnt;

struct sag

s[maxn*30];

int ld[maxn],rd[maxn],le[maxn],v[maxn],st[maxn],to[maxn],next[maxn],head[maxn],rt[maxn];

void add(int a,int b)

int readin()

void insert(int x,int &y,int l,int r,int pos)

int query(int x,int y,int l,int r,int a,int b)

int main()

for(i=1;i<=m;i++)

return 0;

}

bzoj3956 Count 解題報告

題目大意 給出n 個數,定義一種好點對 i j 令i需要滿足如下兩個條件之一 1.i j 1 2.對於 k i,j 均有a k n a i a j 詢問若干個區間中的好點對個數。題解 我們首先可以發現,這樣的好點對是不相交的 但會出現包含情況 既不可能出現兩個好點對 i 1,j1 i 2,j2 使得...

BZOJ3956 Count(單調棧 線段樹)

傳送門 感覺這道題蘊含了一些十分巧妙的性質。可以發現好點對實際上很少,最多不超過2n個。當乙個點作為點對中的較小點的時候,最多只能和它左邊第乙個大於等於它的點以及它右邊第乙個大於等於它的點配對。維護乙個單調遞減的棧就可以求出所有的好點對。還可以發現對於一段詢問的區間,找出區間中最大的點的位置,那麼區...

BZOJ 3956 Count 單調棧 ST表

題目傳送門 挺有思想的一題,但如果弄清楚了思路這題還是挺簡單的。首先我們可以發揮一下自己的腦洞,發現所有的好集對不可能相交。那麼我們可以刷兩遍單調棧,求出每個點作為區間左端點或右端點的次數。對於給定區間,我們先找出區間中最大值所在的位置,顯然所有的好集對最多以這個位置為左端點或右端點,不可能包含這個...