考試時只會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。因為每個異色三角形都恰有兩個異色角。在有向完全圖中結論依然成立,但這裡的異色角就要分別統計兩齣,一入一出,兩齣三種情況。我們只需要分別知道每個點進 出的紅 綠路徑數量即可...