洛谷P3380 二逼平衡樹 (樹套樹)

2021-08-10 21:47:12 字數 2461 閱讀 5536

題目傳送門:

題目分析:為什麼我要把這道模板題寫在部落格上呢?因為我想記錄乙個卡常的小技巧。騙訪問量

這題我是考noip之前碼的,寫的是座標線段樹套動態開節點的權值線段樹,雖然空間是o(

nlog2(

n)) ,但實際空間並沒有這麼大。由於在

log(n)

棵線段樹上同時二叉查詢,時間是o(

mlog2(

n)) 的,然而被卡成了70分,跑得比ghastlcon的

log3(n

) 的zkw線段樹+二分+treap還慢。

多次修改後還是t3個點,我決定棄坑了。今天早上我忽然想到乙個很有力的優化:如果權值線段樹已經走到空節點,就不要再往下走,直接退出。結果900多ms卡過了這題qaq。

code:

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

const

int maxn=50100;

const

int maxl=21;

const

int oo=2147483647;

struct tnode

tree[maxn*maxl*maxl];

tnode *seg[maxn<<2];

tnode *root[maxl<<1];

int cur=-1,num;

struct data

work[maxn*3];

int temp;

int a[maxn];

int b[maxn<<1];

int n,m;

bool comp1(data x,data y)

void build(int root,int l,int r)

int query(tnode *root,int l,int r,int x,int y)

int ask(int root,int l,int r,int x,int y,int v)

void push(int root,int l,int r,int x,int y)

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

int left=root<<1;

int right=left|1;

push(left,l,mid,x,y);

push(right,mid+1,r,x,y);

}int find(int l,int r,int rank)

else

}void update(tnode *&root,int l,int r,int x,int v)

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

if (x<=mid) update(root->lson,l,mid,x,v);

else update(root->rson,mid+1,r,x,v);

root->sum=root->lson->sum+root->rson->sum;

}void insert(int root,int l,int r,int x,int v)

void delete(int root,int l,int r,int x,int v)

int main()

int x=n;

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

else

}for (int i=1; i<=x; i++) work[i].time=i;

sort(work+1,work+x+1,comp1);

temp=work[1].id=1;

for (int i=2; i<=x; i++)

if (work[i-1].val==work[i].val) work[i].id=temp;

else work[i].id=++temp,b[temp]=work[i].val;

sort(work+1,work+x+1,comp2);

new_node();

build(1,1,n);

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

if (work[i].opt==2)

if (work[i].opt==3) insert(1,1,n,work[i].l,work[i].id);

if (work[i].opt==4)

printf("%d\n",ans);

}if (work[i].opt==5)

printf("%d\n",ans);

}if (work[i].opt==6) delete(1,1,n,work[i].l,work[i].id);

}//printf("%d\n",sizeof(tree)>>20);

return

0;}

洛谷P3380 模板 二逼平衡樹(樹套樹)

查詢k在區間內的排名 查詢區間內排名為k的值 修改某一位值上的數值 查詢k在區間內的前驅 前驅定義為嚴格小於x,且最大的數,若不存在輸出 2147483647 查詢k在區間內的後繼 後繼定義為嚴格大於x,且最小的數,若不存在輸出2147483647 輸入格式 第一行兩個數 n,m 表示長度為n的有序...

洛谷P3380 模板 二逼平衡樹(樹套樹)

查詢k在區間內的排名 查詢區間內排名為k的值 修改某一位值上的數值 查詢k在區間內的前驅 前驅定義為嚴格小於x,且最大的數,若不存在輸出 2147483647 查詢k在區間內的後繼 後繼定義為嚴格大於x,且最小的數,若不存在輸出2147483647 輸入格式 第一行兩個數 n,m 表示長度為n的有序...

洛谷P3380 模板 二逼平衡樹(樹套樹)

查詢k在區間內的排名 查詢區間內排名為k的值 修改某一位值上的數值 查詢k在區間內的前驅 前驅定義為嚴格小於x,且最大的數,若不存在輸出 2147483647 查詢k在區間內的後繼 後繼定義為嚴格大於x,且最小的數,若不存在輸出2147483647 輸入格式 第一行兩個數 n,m 表示長度為n的有序...