一棵樹,每個點有點權,多次操作
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 longview code#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}}
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的字尾是...