BZOJ4568 Scoi2016 幸運數字

2021-09-08 04:06:12 字數 930 閱讀 7475

樹的點分治,每次求出重心後,求出重心到每個點路徑上的數的線性基。

對於每個詢問,只需要暴力合併兩個線性基即可。

時間複雜度$o(60n\log n+60^2q)$。

#includetypedef long long ll;

const int n=20010,m=200010,e=m*30;

int n,m,i,x,y,g[n],v[n<<1],nxt[n<<1],ok[n<<1],ed;

int all,f[n],son[n],now,pos[n];

int g[n],v[e],nxt[e],ed,p[m],cnt;

ll a[n],ans[m];

struct qq[m];

struct b

inline void ins(ll x)}}

inline ll ask()

}h[n],b;

inline void read(int&a)

inline void read(ll&a)

inline void add(int x,int y)

inline void add(int x,int y)

void findroot(int x,int y)

if(all-son[x]>f[x])f[x]=all-son[x];

if(f[x]a[j])b.ins(y->a[j]);

ans[p[i]]=b.ask();

} for(i=g[now];i;i=nxt[i])if(ok[i])ok[i^1]=0,solve(v[i]);

}int main()

son[1]=n;solve(1);

for(i=1;i<=m;i++)printf("%lld\n",ans[i]);

return 0;

}

BZOJ4568 Scoi2016 幸運數字

樹上查兩點間最大異或和 樹倍增,每個點維護向上2 k個點的線性基,然後在查lca的時候合併 關於點權維護倍增略蛋疼 合併線性基的時候就直接把乙個線性基里的插到另乙個裡 複雜度o m log n log 2inf 合併的時候加點優化可以降掉乙個loginf 接下來bb一些有關線性基和最大異或和的東西 ...

BZOJ 4568 Scoi2016 幸運數字

題目大意 給你一顆樹,多個詢問,問你樹上任意兩點的路徑上選任意幾個點使得異或和最大。我是參考的claris大神的 點分治,對於詢問在兩個子樹間或者有乙個在重心上的進行回答,否則把問題用鍊錶接到詢問點所在的子樹上。具體方法可以選中重心都對每個子樹染色,染為這個子樹的根節點。在子樹處理問題之前一定要記住...

BZOJ 4568 Scoi2016 幸運數字

可以合併的東西都是人類互相傷害的 參照cogs上採礦那道題 可以用樹剖維護線性基,複雜度q logn 2 logw 2 顯然會t。考慮到沒有修改 用點分治離線來做 乙個詢問如果經過當前分治根,則立即處理並不再下傳,否則下傳到相應子樹去做 複雜度nlognlogw qlogwlogw include ...