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 << " ";
		}
	}
}
posted @ 2025-05-21 19:48  KevinLikesCoding  阅读(43)  评论(0)    收藏  举报