吉司機線段樹

2022-02-05 04:40:24 字數 2741 閱讀 5570

學了一下吉老師的在某年wc的講的線段樹。

特來總結,學習一番.

楔子:給出乙個數列a 每次讓某個區間中的\(a_i\)對x取min 詢問某個區間的和。

\(n,m\leq 500000\)

由於存在多次詢問 我們進行標記永久化也沒什麼用 如果是一次的話我可以每次把標記標記到區間 最後求值即可。

這裡要引出吉司機線段樹了。

做法:線段樹維護區間最大值mx 最大值次數 t 次大值 se 維護區間和 sum

當某個區間要對x取min時 顯然 mx<=x直接跳過這個區間 se最壞的情況 x通過吉老師的證明 這複雜度最壞是mlog^2的!

具體證明:自己看pdf... 好吧聽說吉老師證明是萎的 具體證明看國家集訓隊** 時間複雜度 每次修改時間複雜度為log^2

說了這麼多了 上例題/cy

bzoj 4695最假女選手

雖然很複雜 但是 還是要碼的 要迎男而上 男上加男?

//#include#include#include#include#include#include#include#include#include#include#include#include#include#include#include#include#include#include#include#define ll long long

#define db double

#define inf 2000000000

#define ld long double

#define pb push_back

#define put(x) printf("%d\n",x)

#define rep(p,n,i) for(re int i=p;i<=n;++i)

#define pii pair#define f first

#define mk make_pair

#define mod 64123

#define re register

#define get(x) x=read()

#define gt(x) scanf("%d",&x)

#define go(x) for(int i=lin[x],tn=ver[i];i;tn=ver[i=nex[i]])

#define l(p) t[p].l

#define r(p) t[p].r

#define sum(p) t[p].sum

#define mx(p) t[p].mx

#define mn(p) t[p].mn

#define sx(p) t[p].sx

#define sn(p) t[p].sn

#define tag(p) t[p].tag

#define cx(p) t[p].cx

#define cn(p) t[p].cn

#define zz p<<1

#define yy p<<1|1

#define ls p<<1,l,r

#define rs p<<1|1,l,r

using namespace std;

char buf[1<<15],*fs,*ft;

inline char getc()

inline int read()

while(ch>='0'&&ch<='9')

return x*f;

}const int maxn=500010;

int n,q;

struct wy

t[maxn<<2];

inline void pushup(int p)

inline void pushdown(int p)

if(mx(p)mn(zz))

if(mn(p)>mn(yy)) }

inline void change(int p,int l,int r,int x)

int mid=(l(p)+r(p))>>1;

pushdown(p);

if(l<=mid)change(ls,x);

if(r>mid)change(rs,x);

pushup(p);

}inline void modifymax(int p,int l,int r,int x)

int mid=(l(p)+r(p))>>1;

pushdown(p);

if(l<=mid)modifymax(ls,x);

if(r>mid)modifymax(rs,x);

pushup(p);

}inline void modifymin(int p,int l,int r,int x)

inline ll ask(int p,int l,int r)

inline int querymax(int p,int l,int r)

inline int querymin(int p,int l,int r)

int main()

return 0;

}

一遍ac 再見 這又臭又長的** 把我給寫蒙蔽了 沒想到這麼長 儘管我已經極力壓行了。。

考慮標記問題 我們在下放標記是 有兩類標記 可以發現 賦值標記可以被區間加標記給修改 區間加標記則不能被賦值標記修改。

所以我們在進行區間修改時 我們把賦值標記修改後就相當於賦值標記後來 區間加標記先來這個順序。

所以再pushdown的時候也同樣 先區間賦值 再單點賦值。

需要注意的是 修改mx時會影響到mn sn,修改mn時可能會影響到mx sx.

勢能線段樹 吉司機線段樹 我沒有腦子

bzoj3211 花神遊歷各國 bzoj5312 冒險 bzoj4355 play with sequence bzoj4695 最假女選手 a i max a i,x 這種操作的 tag 不需要實際記錄下來,son.mn1 min max son.mn1,dad.mn1 dad.mx1 就行了。修...

hdu6521 Party(吉司機線段樹)

題意 有n個人,一開始所有人互相不認識。現在有m場party,每場給出l,r,表示編號在 l,r 內的所有人參加,參加之後這些人互相認識。現在要求計算每次party之後會有多少對新的互相認識的人,資料範圍 n,m 2e5 解法 因為區間是連續的,令l i 表示第i個人向左方向認識的最大位置 不需要r...

模板 吉老師線段樹

acm模板 gorgeous sequence 區間最值操作往往採用以下辦法 線段樹維護 實現區間最小值操作,考慮u節點維護的區間,進行如下處理 時間複雜度請直接查閱吉老師2016年國家集訓隊 不太會 define io ios sync with stdio false cin.tie cout....