給定一棵
n 個節點的樹,
1號節點為根每個節點上面有乙個由小寫字母組成的字串si
和乙個權值va
li,兩個字串si
,sj 組合起來的收益為lc
p(si
,sj)
。 定義d
ecu 為
u 子樹內所有的點,那麼以
u為根的子樹的總收益為 an
su=∑
i∈de
cu∑j
∈dec
u,ivali
xorv
alj)
×lcp
(si,
sj)
對每一節點輸出其子樹的總收益。2≤
n≤105
,0≤v
ali≤
105,1
≤u,v
≤n,∑
|si|
≤5×10
5 看到異或運算直接拆位。
考慮維護乙個子樹的tr
ie,統計答案的話可以每乙個節點開乙個
logval
的陣列記錄某一位是0/
1 的節點由多少個,然後列舉tr
ie上節點。
然後我們直接用線段樹合併的方法合併tr
ie同時更新答案就好了。
時間複雜度o(
∑|si
|log
nlogva
l)。
#include
#include
#include
#include
using
namespace
std;
typedef
long
long ll;
int read()
int buf[30];
void write(ll x)
const
int n=100005;
const
int e=n<<1;
const
int l=500015;
const
int lgn=17;
const
int s=l+n;
const
int c=26;
int val[n],last[n];
int tov[e],nxt_[e];
char str[l];
ll ans[n];
int n,tot;
int cnt[s][lgn][2];
int nxt[s][c];
int root[n];
int tots;
int newnode(int val)
void ins(int id,int val)
int merge(int x,int y,ll &ret)
for (int c=0;creturn x;
}void insert(int x,int y)
void dfs(int x,int fa=0)
int main()
1220 生命之樹
給一棵樹和每個結點的權值,求聯通塊的最大權值和 第一行乙個整數 n 表示這棵樹有 n 個節點。第二行 n 個整數,依次表示每個節點的權值。接下來 n 1 行,每行 2 個整數 u,v 表示存在一條 u 到 v 的邊。由於這是一棵樹,所以是不存在環的。樹的節點編號從 1 到 n 輸出一行乙個數,表示聯...
289 生命遊戲
給定乙個包含 m n 個格仔的面板,每乙個格仔都可以看成是乙個細胞。每個細胞都具有乙個初始狀態 1 即為活細胞 live 或 0 即為死細胞 dead 每個細胞與其八個相鄰位置 水平,垂直,對角線 的細胞都遵循以下四條生存定律 如果活細胞周圍八個位置的活細胞數少於兩個,則該位置活細胞死亡 如果活細胞...
289 生命遊戲
四月份每日一題打卡 4月2日 題目描述 解題思路 在這裡插入 片 public void gameoflife int board int dy int rows board.length int cols board 0 length for int i 0 i rows i 如果周圍細胞數少於兩...