簡易版第k大(權值線段樹)
比較簡單的權值線段樹模板題,主要用來學一下動態開點
一般權值線段樹模板ac_code
1 include 2動態開點權值線段樹模板ac_codeusing
namespace
std;
3 typedef long
long
ll;4
const
int maxn = 1e6+10;5
const
int inf=0x3f3f3f3f;6
#define rep(i,first,last) for(int i=first;i<=last;i++)
7#define dep(i,first,last) for(int i=first;i>=last;i--)
8int
n,q;
9int
a[maxn];
10int tree[maxn<<3
];11
12void updata(int rt,int l,int r,int pos,int
val)
17int mid=(l+r)>>1;18
if( pos>mid ) updata(rt<<1|1,mid+1
,r,pos,val);
19else updata(rt<<1
,l,mid,pos,val);
20 tree[rt]=tree[rt<<1]+tree[rt<<1|1
];21}22
23int kth(int rt,int l,int r,int
k)29
30int
main()
3137 rep(i,1
,q)44
else50}
51return0;
52 }
可以發現動態開點比普通的節省了很多空間
權值線段樹 動態開點
普通平衡樹 題目給的資料是1e 7到1e7,直接寫線段樹記憶體肯定是比較吃力,而且題目還要維護rank和第k大,這時候就用到動態開點了,因為運算元一共就1e5,所以最多也只需要開 log 2 2e7 大小的陣列。修改函式void add int rt,int l,int r,int x,int v ...
掃瞄線講解,動態開點版線段樹
首先,掃瞄線是幹什麼的?掃瞄線一般運用在圖形上面,它和它的字面意思十分相似,就是一條線在整個圖上掃來掃去,它一般被用來解決圖形面積,周長等問題,以一道例題為例。給出n個正方形,這些正方形在平面直角座標系中互相重疊擺放,但四條邊都與座標軸平行,例如下圖所示。那麼知道題目了,怎麼運用呢?首先我們需要知道...
權值線段樹 動態開點(學習小結)
include include define fo i,a,b for int i a i b i const int n 200050 using namespace std int t n 18 ls n 18 rs n 18 x,now,add,tot int tag n 18 int n,n...