學了一下吉老師的在某年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最假女選手
雖然很複雜 但是 還是要碼的 要迎男而上 男上加男?
一遍ac 再見 這又臭又長的** 把我給寫蒙蔽了 沒想到這麼長 儘管我已經極力壓行了。。//#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;
}
考慮標記問題 我們在下放標記是 有兩類標記 可以發現 賦值標記可以被區間加標記給修改 區間加標記則不能被賦值標記修改。
所以我們在進行區間修改時 我們把賦值標記修改後就相當於賦值標記後來 區間加標記先來這個順序。
所以再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....