帶修改的主席樹

2022-02-05 10:33:33 字數 3507 閱讀 1149

對於單點修改的主席樹,我們可以採用樹套樹來寫,原因 不會整體二分求帶修改的區間第k小。

所以學習了一波 待修改的主席樹。真的是難寫,或者說碼量有點大。

不過和三維偏序cdq分治相比其實差不了多少,但是cdq終究比樹套樹快而且空間消耗小。

兩者都很不錯!

經典題,但是對於我這個根本不懂樹套樹的人來說是有點難度的考慮整體二分吧,但是呢不會。

所以上主席樹,核心:主席樹維護區間 樹狀陣列維護位置。

還不懂麼?先想如果直接線段樹的話 每次修改後面的主席樹都要改一遍然後 複雜度 n^2logn

如何優化 考慮樹狀陣列吧 每次修改我們至多修改 logn棵主席樹 每棵主席樹的修改是 logn的。

複雜度 log^2n 所以我們愉快的以總時間複雜度 nlog^2n 空間複雜度 (n+m)logn

都還行。

//

#include

#include#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define inf 2147483646

using

namespace

std;

char buf[1

<<15],*fs,*ft;

inline

char

getc()

inline

intread()

while(ch>='

0'&&ch<='9')

return x*f;

}void put(int

x)const

int maxn=100002

;struct

wyt[

60000000

];struct

wy1g[maxn

<<1

];int

n,m;

int a[maxn<<1],b[maxn<<1

],cnt,num;

int root[maxn<<1

],cnt1,ans;

intq[maxn],q1[maxn],top,top1;

char ch[5

];void

discrete()

void change(int &now,int l,int r,int w,int x,int

d)void add(int x,int y,int

v)int

sigma()

void ask(int x,int y,int l,int r,int

k)

else

}ans=l;return;}

intmain()

else

}discrete();

//for(int i=1;i<=n;i++)cout/

for(int i=1;i<=n;i++)cout

,a[i]);

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

else

}return0;

}

view code

我是覺得有點難寫了,但是仍然是堅持碼完了。

這道題呢其實也是可以樹套樹的,考慮先將整體逆序對全部求出然後 每次動態的刪除某個數(log^2n)

然後計算刪掉這個數後對答案的總影響即可。

//

#include

#include#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define inf 2147483646

#define ll long long

using

namespace

std;

char buf[1

<<15],*fs,*ft;

inline

char

getc()

inline

intread()

while(ch>='

0'&&ch<='9')

return x*f;

}void

put(ll x)

const

int maxn=100002

;int

n,m,cnt;

ll ans;

inta[maxn],c[maxn];

int root[maxn<<1

],pos[maxn];

int q[50],q1[50

],top,top1;

struct

wyt[

28900000];//

空間 nlog^2n 3e7左右 貌似300多mb但是應該能過

void add(int x,int y)

int ask(int

x)void

state()

return;}

void change(int &now,int l,int r,int now1,int x,int

y)void insert(int x,int

y)int ask(int x,int y,int d,int

p)

for(int i=1;i<=top;i++)q[i]=t[q[i]].r;

for(int i=1;i<=top1;i++)q1[i]=t[q1[i]].r;

l=mid+1

; }

else

for(int i=1;i<=top;i++)q[i]=t[q[i]].l;

for(int i=1;i<=top1;i++)q1[i]=t[q1[i]].l;

r=mid;}}

return

num;

}int

main()

return0;

}

view code

我也不知道還能堅持多久。

學習筆記 帶修改主席樹

區間帶修改的第 k 大需要用帶修改主席樹。如果用平常的主席樹的效率是多少呢?查詢 o logn 暴力修改 o nlogn 時間不支援 那麼就需要平衡一下兩者的時間複雜度 我們用樹狀陣列套主席樹,每次查詢把 logn 個 rt 取出來,l 1 和 r 的 sum 相減一下,在值域進行 logn 的遍歷...

Data 帶修改的主席樹 樹狀陣列套主席樹

樹狀陣列套主席樹 樹狀陣列的每個節點維護的是一段區間,我們將每個區間構造成一棵線段樹,這時候如果我們要修改乙個值,只需要修改logn個節點即可,時間複雜度為log 2 n 樹狀陣列維護的區間是數的個數n 離散化時是把所有數 包括要修改的數 全部離散化 1.修改 在修改之前,我們應先把序列裡原來的值在...

可修改主席樹 樹上可修改主席樹 樹套樹套樹

題目 思路 其實樹上主席樹是把每一棵主席樹看做樹狀陣列上的乙個點,每次修改log棵主席樹,求區間和的時候同樣log查詢字首和。上 include define d while d isdigit ch getchar using namespace std const int n 2e4 5 int...