集訓0403 problem A 點分治

2021-08-19 00:04:42 字數 1858 閱讀 7053

考試時只會70分的o(

nlog

2n) o(n

log2

n)

的做法,就直接點分治,對每個重心

x x

維護乙個po

weri

−dis

[i][

x]' role="presentation" style="position: relative;">pow

eri−

dis[

i][x

]pow

eri−

dis[

i][x

]的字首和,可以用資料結構維護。但是我們發現在下一層,我們所需要的答案只會減少乙個值,所以就可以不同資料結構維護,做到o(

nlog

n)o (n

logn

)。

注意離開一顆子樹後要消除它的影響。

#include

#include

#include

#include

#include

using

namespace

std;

#define ll long long

int read()

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

return x*f;

}int num[30];

void write(ll x)

putchar('\n');

}const

int maxn=200010,maxm=500010;

int n,m;

struct edgee[maxn<<1];

int last[maxn],len=0;

void ins(int x,int y)

vector

h[maxn];

ll ans[maxn];

int root,son[maxn],totsize;

bool del[maxn];

ll s[maxn],sums=0;int s[maxn],sums=0;

// 權值和 個數

int get_size(int x,int fa)

return size;

}int get_root(int x,int fa)

son[x]=max(mx,totsize-size);

if(root==-1)root=x;

else

if(son[x]return size;

}int mxdep;

void dfs(int x,int fa,int depth,ll o)

}for(int i=last[x];i;i=e[i].next)

}ll ts;int ts;

void dfs(int x,int fa,int depth)

}void dfs_mark(int x,int fa,int depth)

}void dfs_x(int x,int fa,int depth,int rt)

for(int i=last[x];i;i=e[i].next)

}void calc(int x)

dfs(x,0,0,-1);

}int fa[maxn];

void solve(int x)

}int main()

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

root=-1;

totsize=n;

get_root(1,0);

solve(root);

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

}

BJ 集訓測試1 Problem A 網格

題意 n m的矩陣 每次可以固定乙個格仔或者解除固定乙個格仔 詢問全圖網格是否是穩定的 那麼分析可得 是否穩定我們可以先列出方程 考慮針對乙個四個格仔觀察他們交接的那個點 他們四個角角度相加一定是360 所以可以列出方程 那麼針對每個這樣的點都去列方程 然後用其他變數來表示可以得到乙個關係式 可以感...

集訓心得3(一點點排列組合)

明天早上考試,聽l老師說有有數學基礎部分的,看了乙個下午的數學書 笑哭 晚上敲部落格惡補哈哈哈哈 emmmmm前面的加法原理and乘法原理小學內容 略略略 一.排列與組合 這個符號醉了,上圖吧。一堆公式不好打又沒圖,提高篇p159 求c n,m n中去m個 1 加法遞推 o n n 核心 c n m...

聯合集訓6 9 El 點分治 雜湊表

轉化題意,就是根據題目所給的式子定義顏色,求同色三角形的個數。有乙個經典結論 完全圖同色三角形個數 總三角形個數 異色角個數 2。因為每個異色三角形都恰有兩個異色角。在有向完全圖中結論依然成立,但這裡的異色角就要分別統計兩齣,一入一出,兩齣三種情況。我們只需要分別知道每個點進 出的紅 綠路徑數量即可...