SDOI2017 切樹遊戲

2022-05-22 19:57:12 字數 2327 閱讀 2752

一棵樹,每個點有點權,多次操作

1.單點修改乙個點的點權

2.詢問有多少棵子樹點權異或和為 $k$

$n \leq 30000,k \leq 128,q \leq 30000$

sol:

動態 dp

為防止自己忘,再寫一遍

乙個點的 dp 值 = $\sum dp_ + dp_$

這樣就可以一條重鏈一起轉移

用線段樹維護重鏈上的轉移,每次修改時跳 log n 條重鏈

這題還要強行整個 fwt,甚至還要寫乙個模 mod 剩餘類,維護乘了多少個 0

#include #define ll long long

#define rep(i, s, t) for (register int i = (s), i##end = (t); i <= i##end; ++i)

#define dwn(i, s, t) for (register int i = (s), i##end = (t); i >= i##end; --i)

using

namespace

std;

inline

intread()

const

int mod = 10007, maxn = 65010, maxk = 256

;int

n, m, inv[maxn];

intval[maxn], e[maxk][maxk], ans[maxk], tmp[maxk];

struct

mint

else

}friend mint

operator*(mint a, int

b) friend mint

operator/(mint a, int

b)

int real()

} f[maxn][maxk];

inline

int inc(int x, int

y) inline

int dec(int x, int

y) void fwt(int *a, int n, int

f) }

vector

g[maxn], ch[maxn];

intfa[maxn], dep[maxn], bl[maxn], mxs[maxn], size[maxn], stk[maxn], top;

inline

void dfs1(int

x) }

inline

void dfs2(int x, int

col)

}int cmp(int i, int j)

int root[maxn], ls[maxn << 6], rs[maxn << 6], anc[maxn << 6], pos[maxn << 6

], tot;

inth[maxn][maxk], lval[maxn][maxk], rval[maxn][maxk], sum[maxn][maxk];

void pushup(int

x) }

inline

void build(int &x, int l, int r, int

ps)

int mid = (l + r) >> 1

; build(ls[x], l, mid, ps);

anc[ls[x]] =x;

build(rs[x], mid + 1

, r, ps);

anc[rs[x]] =x;

//anc[ls[x]] = anc[rs[x]] = x;

pushup(x);

}inline

void modify(int

u) int

main()

dfs1(1);

dfs2(

1, 1

); rep(i,

0, m - 1

) rep(i,

1, n) rep(j, 0, m - 1) f[i][j] =mint(e[val[i]][j]);

sort(stk + 1, stk + top + 1

, cmp);

rep(i,

1, top)

//rep(i, 0, m-1) cout << ans[i] << " ";

//cout << endl;

int q =read();

char opt[10

];

while (q--)

else}}

view code

SDOI2017 切樹遊戲

題目 二輪毒瘤題啊 辣雞洛谷竟然有卡樹剖的資料 還是 loj 可愛 首先這道題沒有帶修,設 dp 表示以 i 為最高點的連通塊有多少個異或和為 j g sum dp k in tree i 表示 k 在 i 子樹內部 我們可以直接把每乙個權值 fwt 一下,大力合併就好了,合併直接對位相乘,只需要在...

SDOI2017 切樹遊戲

設 f 表示 x 子樹中,所有包含 x 且異或和為 i 的連通塊數量,f 表示 x 子樹中異或和為 i 的連通塊數量。顯然,有公式 f f sum limits x f 現在考慮 f 的轉移。假如我們要合併 x 與某個兒子 y 的dp陣列,則顯然有公式 f sum limits k i f time...

SDOI2017 硬幣遊戲

考慮生成函式來做 g x 函式就是0 0 x 1 x s n s x n 就是最後s位必須填這個串,但是前面隨便填的方案數 然後列舉之前出現了哪個串 包括自己 如果沒有相交,就是fj x g x 還有就是有前字尾有相交部分,pji x 中的第k位,表示i的長度為m k的字首和j的長度為m k的字尾是...