COTS 2025 做题笔记 / 代码集
COTS 2025 做题笔记 / 代码集
目录
[COTS 2025] A - 发好奖 / Hijerarhija
ケロシの代码
const int N = 5e3 + 5;
const int INF = 1e9 + 7;
int n, m, p[N], a[N], b[N];
vector<int> e[N];
int dp[N][N], F[N], G[N];
void dfs(int u, int fa) {
FOR(i, 0, m) G[i] = - INF;
FOR(i, 0, m - 1) chmax(G[i + 1], F[i]);
FOR(i, 0, m - b[u]) chmax(G[i + b[u]], F[i] + a[u]);
FOR(i, 0, m) F[i] = G[i];
FOR(i, 0, m) dp[u][i] = F[i];
for(int v : e[u]) {
if(v == fa) continue;
dfs(v, u);
FOR(i, 0, m) chmax(F[i], dp[u][i]);
FOR(i, 0, m) chmax(dp[u][i], F[i]);
}
}
void solve() {
cin >> n >> m;
FOR(i, 2, n) cin >> p[i];
FOR(i, 2, n) e[p[i]].push_back(i);
FOR(i, 1, n) cin >> a[i];
FOR(i, 1, n) cin >> b[i];
F[0] = 0;
FOR(i, 1, m) F[i] = - INF;
dfs(1, 0);
int ans = 0;
FOR(i, 0, m) chmax(ans, F[i]);
cout << ans << endl;
}
[COTS 2025] B - 数好图 / Promet
ケロシの代码
const int N = 2e3 + 5;
int n, P;
inline int add(int x, int y) { return (x + y < P ? x + y : x + y - P); }
inline void Add(int & x, int y) { x = (x + y < P ? x + y : x + y - P); }
inline int sub(int x, int y) { return (x < y ? x - y + P : x - y); }
inline void Sub(int & x, int y) { x = (x < y ? x - y + P : x - y); }
inline int mul(int x, int y) { return (1ll * x * y) % P; }
inline void Mul(int & x, int y) { x = (1ll * x * y) % P; }
inline int sgn(int x) { return (x & 1) ? P - 1 : 1; }
int mul(initializer_list<int> a) {
int res = 1;
for(int x : a) Mul(res, x);
return res;
}
int fp(int x, int y) {
int res = 1;
for(; y; y >>= 1) {
if(y & 1) Mul(res, x);
Mul(x, x);
}
return res;
}
int pw[N];
int dp[N][N], F[N];
int f[N][N], g[N][N];
int ans[N];
void solve() {
cin >> n >> P;
pw[0] = 1;
FOR(i, 1, n) pw[i] = mul(pw[i - 1], 2);
dp[1][0] = 1;
FOR(i, 2, n) REP(j, i) {
int val = dp[i - 1][j];
if(j) Add(val, dp[i - 1][j - 1]);
dp[i][j] = mul(val, pw[i - 1 - j] - 1);
}
FOR(i, 2, n) REP(j, i) Add(F[i], mul(dp[i][j], sgn(j)));
f[1][0] = 1;
FOR(i, 2, n - 1) REP(j, i) {
Add(f[i][j], f[i - 1][j]);
if(j) Add(f[i][j], mul(f[i - 1][j - 1], pw[n - i]));
}
g[1][0] = 1;
FOR(i, 1, n) FOR(j, 0, n - i) {
Add(g[i][j], g[i - 1][j]);
if(i > 1) Add(ans[i], mul(g[i][j], f[n - 1][n - i - j]));
if(j) Add(g[i][j], mul(g[i][j - 1], pw[i + j - 1] - 1));
}
FOR(i, 2, n) Mul(ans[i], F[i]);
ans[0] = fp(2, n * (n - 1) / 2);
FOR(i, 1, n) Sub(ans[0], ans[i]);
FOR(i, 0, n) cout << ans[i] << " "; cout << endl;
}
[COTS 2025] C - 答好位 / Vrsta
ケロシの代码
const int N = 2048 + 5;
int n, q;
int vis[N][N], ans[N][N];
int query(int l, int r) {
cout << "? " << l << " " << r << endl << flush;
int u; cin >> u;
return u;
}
void slv(int l, int r, int mid) {
if(l >= r || vis[l][r]) return;
int pos = query(l, r);
if(pos < mid) {
FOR(i, l, pos) FOR(j, mid, r) ans[i][j] = pos;
slv(l, mid - 1, pos);
slv(pos + 1, r, mid);
}
else {
FOR(i, l, mid) FOR(j, pos, r) ans[i][j] = pos;
slv(l, pos - 1, mid);
slv(mid + 1, r, pos);
}
vis[l][r] = 1;
}
void solve() {
cin >> n;
int pos = query(1, n);
int mx = - 1;
if(pos > 1 && query(1, pos) == pos) {
FOR(i, 1, pos - 1) {
int x = query(i, pos);
if(x == pos) mx = i;
}
}
else {
ROF(i, n, pos + 1) {
int x = query(pos, i);
if(x == pos) mx = i;
}
}
slv(1, n, mx);
cout << "!" << endl << flush;
cin >> q;
REP(_, q) {
int l, r;
cin >> l >> r;
cout << ans[l][r] << endl << flush;
}
}
[COTS 2025] D - 砍树 / Stablo
ケロシの代码
const int N = 1e3 + 5;
const int INF = 1e9 + 7;
int n, p[N], id[N], a[N];
vector<int> e[N];
int vis[N], sz[N], f[N], rt, pre;
int query(int a, int b, int c) {
cout << "? " << a << " " << b << " " << c << endl << flush;
int x; cin >> x;
return x;
}
void slv(int l, int r) {
if(l == r) return;
int mid = l + r >> 1;
slv(l, mid); slv(mid + 1, r);
int c1 = l, c2 = mid + 1, c = 0;
REP(_, r - l + 1) {
if(c2 > r || (c1 <= mid && query(1, id[c1], id[c2]) <= 1))
a[++ c] = id[c1 ++];
else a[++ c] = id[c2 ++];
}
FOR(i, 1, r - l + 1) id[l + i - 1] = a[i];
}
void add(int u, int v) {
p[u] = v;
e[v].push_back(u);
e[u].push_back(v);
}
void dfs0(int u, int fa) {
sz[u] = 1;
for(int v : e[u]) {
if(vis[v] || v == fa) continue;
dfs0(v, u);
sz[u] += sz[v];
}
}
void dfs1(int u, int fa, int sum) {
f[u] = max(sz[u], sum - sz[u]);
for(int v : e[u]) {
if(vis[v] || v == fa) continue;
dfs1(v, u, sum);
if(f[v] < f[rt]) {
rt = v;
pre = u;
}
}
}
void solve() {
cin >> n;
FOR(i, 2, n) id[i] = i;
slv(2, n);
FOR(i, 2, n) {
FOR(j, 1, n) vis[j] = 0;
int u = id[i], cur = 1;
while(1) {
dfs0(cur, 0);
if(sz[cur] == 1) break;
f[0] = INF; rt = 0;
dfs1(cur, 0, sz[cur]);
if(query(u, rt, pre) == 1) vis[pre] = 1, cur = rt;
else vis[rt] = 1, cur = pre;
}
add(u, cur);
}
cout << "!" << endl << flush;
FOR(i, 2, n) cout << p[i] << " " << i << endl << flush;
}
[COTS 2025] E - 观草 / Trava
ケロシの代码
const int N = 5e5 + 5;
int n, q, a[N];
struct SgT {
int le[N << 2], ri[N << 2];
int F[N << 2];
void pushup(int u) {
F[u] = max(F[u << 1], F[u << 1 | 1]);
}
void build(int u, int l, int r) {
le[u] = l, ri[u] = r;
if(l == r) {
F[u] = a[l];
return;
}
int mid = l + r >> 1;
build(u << 1, l, mid);
build(u << 1 | 1, mid + 1, r);
pushup(u);
}
void modify(int u, int p) {
if(le[u] == ri[u]) {
F[u] ++;
return;
}
int mid = le[u] + ri[u] >> 1;
if(p <= mid) modify(u << 1, p);
else modify(u << 1 | 1, p);
pushup(u);
}
int query_l(int u, int r, int x) {
if(r < le[u]) return 0;
if(F[u] <= x) return 0;
if(le[u] == ri[u]) return le[u];
int val = query_l(u << 1 | 1, r, x);
if(val == 0) val = query_l(u << 1, r, x);
return val;
}
int query_r(int u, int l, int x) {
if(ri[u] < l) return n + 1;
if(F[u] <= x) return n + 1;
if(le[u] == ri[u]) return le[u];
int val = query_r(u << 1, l, x);
if(val == n + 1) val = query_r(u << 1 | 1, l, x);
return val;
}
} sgt;
struct fenwick {
ll c[N];
int lowbit(int x) {
return - x & x;
}
void modify(int u, ll x) {
for(int i = u; i <= n; i += lowbit(i))
c[i] += x;
}
void modify(int l, int r, ll x) {
modify(l, x);
modify(r + 1, - x);
}
ll query(int u) {
ll res = 0;
for(int i = u; i; i -= lowbit(i))
res += c[i];
return res;
}
} t[2];
void solve() {
cin >> n >> q;
FOR(i, 1, n) cin >> a[i];
sgt.build(1, 1, n);
FOR(i, 1, n) {
int L = i - sgt.query_l(1, i - 1, a[i] - 1);
int R = sgt.query_r(1, i + 1, a[i]) - i;
if(L > R) swap(L, R);
t[0].modify(1, L, a[i]);
t[1].modify(L + 1, R, 1ll * L * a[i]);
t[1].modify(R + 1, L + R - 1, 1ll * (L + R) * a[i]);
t[0].modify(R + 1, L + R - 1, - a[i]);
}
REP(_, q) {
char o; int i;
cin >> o >> i;
if(o == '?') {
cout << t[0].query(i) * i + t[1].query(i) << endl;
}
else {
int L = i - sgt.query_l(1, i - 1, a[i]);
int R = sgt.query_r(1, i + 1, a[i]) - i;
if(L > R) swap(L, R);
t[0].modify(1, L, 1);
t[1].modify(L + 1, R, L);
t[1].modify(R + 1, L + R - 1, L + R);
t[0].modify(R + 1, L + R - 1, - 1);
a[i] ++;
sgt.modify(1, i);
}
}
}
[COTS 2025] F - 吸尘 / Usisavač
ケロシの代码
int n, q;
int fi[N], ne[N << 1], to[N << 1], ecnt;
int d[N], c[N];
void add(int u, int v) {
ne[++ ecnt] = fi[u];
to[ecnt] = v;
fi[u] = ecnt;
}
void dfs(int u, int fa) {
for(int i = fi[u]; i; i = ne[i]) {
int v = to[i];
if(v == fa) continue;
dfs(v, u);
chmax(d[u], d[v] + 1);
}
}
void solve() {
cin >> n >> q;
REP(_, n - 1) {
int u, v;
cin >> u >> v;
add(u, v); add(v, u);
}
dfs(1, 0);
FOR(i, 2, n) c[d[i]] ++;
ROF(i, n, 0) c[i] += c[i + 1];
REP(_, q) {
int x; cin >> x;
if(d[1] <= x) {
cout << (n - 1) * 2 - d[1] << " ";
}
else {
int ans = (n - 1) * 2;
ans += c[x] * 2;
ans -= x;
ans -= d[1] - x;
cout << ans << " ";
}
}
}

浙公网安备 33010602011771号