JZOJ5363 生命之樹

2021-08-08 07:50:19 字數 1557 閱讀 9379

給定一棵

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 如果周圍細胞數少於兩...