CF633G
1.CF1209G2 Into Blocks (hard version)2.「POJ 3744」Scout YYF I3.记录trick4.洛谷P10936 导弹防御塔5.CF1635E Cars6.P8726
7.CF633G
8.CF1436E9.[BJOI2017] 喷式水战改10.「CF407E」k-d-sequence11.「雅礼集训 2017 Day5」珠宝12.AT_jsc2019_final_h Distinct Integers13.CF1430G Yet Another DAG Problem14.[2022CCPC广州] B Ayano and sequences15.[2022CCPC广州] Infection16.[2022CCPC广州] XOR Sum因为这道题是在树上的,所以我们很套路地先 dfs 一次 ,这样一颗子树上的结点的 然而我当时不会用导致考场爆零 这样,我们添加操作就十分简单了,只需要对这个区间的 bitset 整体向左移
AC Code:
#include <bits/stdc++.h>
#define ing long long
#pragma GCC optimeze(3)
#pragma GCC optimeze(2)
using namespace std;
const int N = 2e5 + 5;
int read() {
int x = 0, flag = 1;
char ch = 0;
while (ch < '0' || ch > '9') {
if (ch == '-')
flag = -1;
ch = getchar();
}
while (ch >= '0' && ch <= '9') {
x = (x << 1) + (x << 3) + ch - '0';
ch = getchar();
}
return x * flag;
}
int n, a[N], ver[N * 2], head[N], ne[N * 2], dfn[N], rk[N], cnt, tot, siz[N], m, q, sum = 0;
bool vis[1005];
bitset<1000> tr[N * 4], help, jb;
int b[N * 4];
void add(int x, int y) { ver[++tot] = y, ne[tot] = head[x], head[x] = tot; }
void dfs(int t, int f) {
dfn[t] = ++cnt;
rk[cnt] = t;
siz[t] = 1;
for (int i = head[t]; i; i = ne[i]) {
int to = ver[i];
if (to == f)
continue;
dfs(to, t);
siz[t] += siz[to];
}
}
void pushdown(int p) {
tr[p * 2] = ((tr[p * 2] >> (m - b[p])) | (tr[p * 2] << b[p]));
b[p * 2] += b[p];
b[p * 2] %= m;
tr[p * 2 + 1] = ((tr[p * 2 + 1] >> (m - b[p])) | (tr[p * 2 + 1] << b[p]));
b[p * 2 + 1] += b[p];
b[p * 2 + 1] %= m;
b[p] = 0;
}
void pushup(int p) { tr[p] = tr[p * 2] | tr[p * 2 + 1]; }
void build(int p, int l, int r) {
if (l == r) {
tr[p][a[rk[l]] % m] = 1;
return;
}
int mid = (l + r) >> 1;
build(p * 2, l, mid);
build(p * 2 + 1, mid + 1, r);
pushup(p);
}
void change(int l, int r, int x, int p, int s, int t) {
if (s >= l && t <= r) {
tr[p] = ((tr[p] >> (m - x)) | (tr[p] << x));
b[p] += x;
b[p] %= m;
return;
}
int mid = (s + t) >> 1;
pushdown(p);
if (mid >= l)
change(l, r, x, p * 2, s, mid);
if (mid < r)
change(l, r, x, p * 2 + 1, mid + 1, t);
pushup(p);
}
bitset<1000> qu(int l, int r, int p, int s, int t) {
if (s >= l && t <= r)
return tr[p];
int mid = (s + t) >> 1;
pushdown(p);
bitset<1000> ans = help;
if (mid >= l)
ans |= qu(l, r, p * 2, s, mid);
if (mid < r)
ans |= qu(l, r, p * 2 + 1, mid + 1, t);
return ans;
}
signed main() {
n = read(), m = read();
vis[1] = 1;
for (int i = 2; i < m; i++) {
if (!vis[i]) {
sum++;
jb[i] = 1;
for (int j = 2; j * i < m; j++) {
vis[j * i] = 1;
}
}
}
for (int i = 1; i <= n; i++) {
a[i] = read();
}
for (int i = 1; i < n; i++) {
int u, v;
u = read(), v = read();
add(u, v);
add(v, u);
}
dfs(1, 0);
build(1, 1, n);
q = read();
while (q--) {
int opt, v, x;
opt = read();
if (opt == 1) {
v = read(), x = read();
x %= m;
change(dfn[v], dfn[v] + siz[v] - 1, x, 1, 1, n);
} else {
v = read();
cout << (qu(dfn[v], dfn[v] + siz[v] - 1, 1, 1, n) & jb).count() << endl;
}
}
return 0;
}
本文作者:Xdik
本文链接:https://www.cnblogs.com/Xdik/p/18708137
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步