WC2018 即時戰略(動態點分治,替罪羊樹)

2022-03-19 21:09:52 字數 1408 閱讀 7940

uoj

其實這題我也不知道應該怎麼確定他到底用了啥。只是想法很類似就寫上了qwq。

首先鏈的部分都告訴你要特殊處理那就沒有辦法只能特殊處理了qwq。

首先聽說有一種均攤\(log\)的\(lct\)做法。

即每次隨便\(explore\)乙個點,如果這個點未被訪問過,直接加入然後繼續。

否則在\(lct\)重鏈組成的\(splay\)上跳。

這樣子均攤複雜度是\(o(nlogn)\),均攤的詢問次數也是\(o(nlogn)\)。

然而似乎會被卡。

另一種做法是動態維護點分樹。

假裝我們有乙個點分樹,這樣子每次詢問的時候,如果確定了乙個已知節點,那麼我們從當前節點向著那個節點的點分樹方向移動,這樣子可以證明移動次數不會超過乙個\(log\)。

然而新加入若干點之後點分治的樹可能不在平衡,導致複雜度不正確了。

那麼類似替罪羊樹的思想,如果點分樹之間的大小不滿足平衡,則拆掉重建。

#include#include#include#include#include "rts.h"

using namespace std;

#define max 300300

const double alpha=0.75;

int n,p[max],tot;

bool vis[max];

namespace chain }}

struct linee[max<<1];

int h[max],cnt=1;

inline void add(int u,int v);h[u]=cnt++;}

int fa[max],size[max];

bool del[max];

int book[max],tim;

void clear(int u,int ff)

int size,mx,rt,root;

void getroot(int u,int ff)

ret=max(ret,size-size[u]);

if(ret}void divide(int u)

}void rebuild(int u)

void update(int u)

++size[fa[u]];if(fa[u]&&alpha*size[fa[u]]update(fa[u]);if(del[u])rebuild(u);

}void find(int x)

else add(u,v),add(v,u),fa[v]=u,size[v]=1,update(v),vis[v]=true,u=v; }

}void play(int _n,int t,int datatype)

for(int i=1;i<=tot;++i)if(!vis[p[i]])find(p[i]);

}

WC2018 即時戰略

繼紫荊花之戀後第二道蒟蒻所知道的會動的樹的點分治 題意 給你一顆未知的樹,你只知道1,你可以詢問explore u,v 得到 u,v 路徑上的第乙個點,請你在有限的詢問次數內確定這一棵樹 首先隨機化一下訪問次數,這樣就不會被奇奇怪怪地卡掉了 雖然出題人也是隨的資料 鏈,詢問次數限制n logn,記錄...

WC2018即時戰略

題目描述 小 m 在玩乙個即時戰略 real time strategy 遊戲。不同於大多數同類遊戲,這個遊戲的地圖是樹形的。也就是說,地圖可以用乙個由 n 個結點,n 1 條邊構成的連通圖來表示。這些結點被編號為 1 sim n 每個結點有兩種可能的狀態 已知的 或 未知的 遊戲開始時,只有 1 ...

UOJ 349 WC2018 即時戰略

題目鏈結 一開始已知一號點。每次可以選定乙個已知點和乙個未知點,然後互動庫會返回從已知點出發到達未知點路徑上的第二個點。要求在有限步之內知道每乙個點。次數要求 鏈的情況要求 o n o n o n 其餘是 o n logn o nlogn o nlog n 首先是鏈的情況,記錄當前左右端點不斷往後探...