3600 沒有人的算術

2021-08-03 14:05:51 字數 2062 閱讀 3487

vfk太強了。

題目大意:維護一段由集合組成的序列,集合分左右,支援合併操作,求區間內字典序最大的的位置。

還有wjmzbmr的

《重量平衡樹和字尾平衡樹在資訊學奧賽中的應用》(好像是2023年的**)

思路大致是用平衡樹維護這些集合的相對大小,然後給它乙個實數值表示大小。用平衡樹查詢可以做到logn。

最後再用線段樹求區間最大值。

下面蒟蒻口胡一波替罪羊樹(直接跳過吧)

大概就是當某子樹不滿足平衡條件時,將它暴力重構成類完全二叉樹。

時間複雜度嘛,假裝自己會算了,反正均攤logn

code:

#include#include#include#includeusing namespace std;

int pos[100005];

int r=0,top,id[500005],rt=0;

double a[500005],eq=0.75;

int n,m;

int read()

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

return x*f;

}struct data

friend bool operator==(data x,data y) };

struct trnodetr[500005];int tot=0,trlen=0;

void dfs(int x)

void build(int &x,int l,int r,double lv,double rv)

double mv=(lv+rv)/2.0;

int mid=(l+r)/2;

x=id[mid];a[x]=mv;

build(tr[x].son[0],l,mid-1,lv,mv);

build(tr[x].son[1],mid+1,r,mv,rv);

tr[x].tot=tr[tr[x].son[0]].tot+tr[tr[x].son[1]].tot+1;

}void rebuild(int &x,double lv,double rv)

int insert(int &x,double lv,double rv,data val)

int p;

if(val==tr[x].v) return x;

tr[x].tot++;int lc=tr[x].son[0],rc=tr[x].son[1];

if(tr[x].v>val) p=insert(tr[x].son[0],lv,mv,val);

else p=insert(tr[x].son[1],mv,rv,val);

if(tr[x].tot*1.0*eq>max(tr[lc].tot,tr[rc].tot)) }

else r=x;

return p;

}int bt(int l,int r)

return x;

}void change(int x,int k)

int mid=(tr[x].l+tr[x].r)/2,lc=tr[x].lc,rc=tr[x].rc;

if(k<=mid) change(lc,k);

else change(rc,k);

int lcc=tr[lc].c,rcc=tr[rc].c;

if(a[pos[lcc]]>=a[pos[rcc]]) tr[x].c=lcc;

else tr[x].c=rcc;

}int findans(int x,int l,int r)

int main()

); bt(1,n);a[0]=-1;

for(int i=1;i<=n;i++) pos[i]=1;

for(int i=1;i<=n;i++) change(1,i);

int l,r,k;

char s[10];

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

); if(r) rebuild(rt,0,1);r=0;

change(1,k);

} else printf("%d\n",findans(1,l,r));

}}

3600 沒有人的算術

time limit 20 sec memory limit 128 mb submit 616 solved 280 submit status discuss 湖北省隊互測 week1 submit status discuss 可以發現,每時每刻新增的元素加入之前元素組成的集合中,新集合內的元...

bzoj3600 沒有人的算術

time limit 20 sec memory limit 128 mb submit 1118 solved 452 submit status discuss 湖北省隊互測 week1 submit status discuss 神。神題。具體過程太抽象了。我們考慮如果能有一種方法能快速得到排...

bzoj 3600 沒有人的算術 替罪羊樹

為什麼我沒有copy題面呢?看到題面你就懂了.hh 題意 定義乙個二元組 二元組的兩個元素可以是二元組 如 x,y 其中x可以是 a,b,c 之類的 定義二元組的比較方式 先比較左邊,左邊相同再比較右邊。遞迴比較可以用隨便哪顆平衡樹維護,70分 考慮對於每個 二元組,對他定義乙個實數的對映來表示它的...