bzoj 3786 星系探索 splay

2021-07-25 05:06:20 字數 1293 閱讀 9545

bzoj真是坑爹,本地跑的差不多的程式,指標比陣列快到不知道**去了。

然後我就開始了艱辛的卡常數,最終比很多指標快多辣~~~

由於有子樹移動,那麼考慮維護括號序列。也就是dfs入棧為'(',出棧為')',然後'('為正的權值。那麼子樹移動相當於平衡樹的**和合併。用splay實現。

ps:求卡常數大神優化**》.<

ac**如下(目前最快的):

#include#define ll long long

#define n 200005

using namespace std;

int n,tot,tp,rt,a[n],fst[n],pnt[n],nxt[n],fa[n],c[n][2],q[n];

struct nodep[n];

int read()

return x;

}void add(int x,int y)

void maintain(int x)

void mdy(int x,ll y)

}void pushdn(int x)

}void clr(int x)

int getby(int x,int l) else

}void rot(int x,int &rt)

void splay(int x,int &rt)

maintain(x);

}void dfs(int x,int last)

q[++tp]=x+n;

}void build(int &rt,int l,int r,int last)

int mid=l+r>>1;

rt=q[mid]; fa[rt]=last;

build(c[rt][0],l,mid-1,rt); build(c[rt][1],mid+1,r,rt);

p[rt].num=(rt<=n)?a[rt]:-a[rt-n];

maintain(rt);

}int main()

for (i=1; i<=n; i++) a[i]=read();

q[tp=1]=n<<1|1;

dfs(1,0);

q[++tp]=n+1<<1;

build(rt,1,tp,0);

int cas=read(); char cr; ll ans;

while (cas--) else if (cr=='c') else if (cr=='f')

} return 0;

}

by lych

2016.12.6

BZOJ3786 星系探索

ett搞上,每條邊如果是一條從父到子的邊,那麼設其權值為兒子節點的權值,如果是一條從子到父的邊,那麼設其權值為兒子節點的權值的相反數,我們用乙個splay來維護整棵樹的尤拉序,那麼乙個節點到根的路徑的點權和就等於從根走尤拉序到這個點的邊權和 linkcut操作就相當於區間平移 子樹加就相當於把區間裡...

BZOJ3786 星系探索

一道ett板子題 筆者最開始用fhq treap打的ett,忘記可以沿fafa fa算出它的尤拉序,一直沒調出來,於是就改用splay了。ett的模板。其實我覺得叫它平衡樹板子就可以了 我們可以先通過尤拉序建出一顆平衡樹來,令inx in in x 為點x xx的入尤拉序,out xout outx...

BZOJ 3786 星系探索

bzoj 3786 星系探索 splay維護出棧入棧序 物理學家小c的研究正遇到某個瓶頸。他正在研究的是乙個星系,這個星系中有n個星球,其中有乙個主星球 方便起見我們預設其為1號星球 其餘的所有星球均有且僅有乙個依賴星球。主星球沒有依賴星球。我們定義依賴關係如下 若星球a的依賴星球是b,則有星球a依...