Codeforces Round 988 (Div. 3) 补题记录(A~G)
总结:赛时一题不会,赛后光速 AK
A
namespace Triple_Light {
int a[N];
void run() {
int T = read();
while (T--) {
int n = read();
int buc[30] = {0};
for (int i = 1; i <= n; ++i) {
int x = read();
++buc[x];
}
int cnt = 0;
for (int i = 1; i <= n; ++i) {
cnt += buc[i] / 2;
}
cout << cnt << '\n';
}
} }
B
首先可以知道
总时间复杂度为
namespace Triple_Light {
int a[N], vis[N];
void run() {
int T = read();
while (T--) {
int n = read();
for (int i = 1; i <= n; ++i) {
vis[i] = 0;
}
for (int i = 1; i <= n; ++i) {
a[i] = read();
++vis[a[i]];
}
int kx = n - 2;
for (int i = 1; i * i <= kx; ++i) {
if (kx % i == 0) {
int a = kx / i, b = i;
if (a == b) {
if (vis[a] >= 2) {
cout << a << ' ' << b << '\n';
break;
}
} else {
if (vis[a] && vis[b]) {
cout << a << ' ' << b << '\n';
break;
}
}
}
}
}
} }
C
顶好玩的构造题。首先大于
namespace Triple_Light {
int a[N], vis[N];
void run() {
int T = read();
while (T--) {
int n = read();
for (int i = 1; i <= n; ++i) {
vis[i] = 0;
}
for (int i = 1; i <= n; ++i) {
a[i] = read();
++vis[a[i]];
}
int kx = n - 2;
for (int i = 1; i * i <= kx; ++i) {
if (kx % i == 0) {
int a = kx / i, b = i;
if (a == b) {
if (vis[a] >= 2) {
cout << a << ' ' << b << '\n';
break;
}
} else {
if (vis[a] && vis[b]) {
cout << a << ' ' << b << '\n';
break;
}
}
}
}
}
} }
D
首先若跨越了第
namespace Triple_Light {
int l[N], r[N], x[N], v[N];
void run() {
int T = read();
while (T--) {
int n = read(), m = read(), L = read();
for (int i = 1; i <= n; ++i) {
l[i] = read();
r[i] = read();
}
for (int i = 1; i <= m; ++i) {
x[i] = read();
v[i] = read();
}
int pos = 1;
priority_queue<int> q;
int now = 1, cnt = 0, ok = 1;
for (int i = 1; i <= n; ++i) {
while (pos <= m && x[pos] < l[i]) {
q.push(v[pos]);
++pos;
}
int len = r[i] - l[i] + 2;
if (now < len) {
while (q.size()) {
int t = q.top();
q.pop();
now += t;
++cnt;
if (now >= len) {
break;
}
}
if (now < len) {
ok = 0;
break;
}
}
}
if (ok) {
cout << cnt << '\n';
} else {
cout << "-1\n";
}
}
} }
E
首先考虑手摸一下寻找线索,可以发现若每一次都按照顺序询问一个前缀,则在一开始询问到一堆
数组中存在一个长度为 的全 前缀。- 其余在
前缀内的位置的值全都为 。
然后对于后面仍然询问前缀,若当前询问到前缀和上一次询问前缀的答案相同,则当前位结尾对答案没有贡献,即当前位为
特殊的,若没有找到一个非 IMPOSSIBLE
。
总时间复杂度为
namespace Triple_Light {
int a[N];
void run() {
int T = read();
while (T--) {
int n = read(), pos = 1;
for (int i = 1; i <= n; ++i) {
a[i] = -1;
}
int la = 0;
for (int i = 2; i <= n; ++i) {
cout << "? " << pos << ' ' << i << endl;
int o ; cin >> o;
int to = o;
if (o != la) {
if (!la) {
o -= la;
a[i] = 1;
int j, k;
for (j = i - 1, k = 1; k <= o; --j, ++k) {
a[j] = 0;
}
for (; j >= pos; --j) {
a[j] = 1;
}
la = to;
} else {
a[i] = 1;
la = to;
}
} else if (la) {
// cout << "qwq " << i << '\n';
a[i] = 0;
}
}
if (count(a + 1, a + n + 1, -1)) {
cout << "! IMPOSSIBLE" << endl;
} else {
cout << "! ";
for (int i = 1; i <= n; ++i) {
cout << a[i];
}
cout << endl;
}
}
} }
F
笑点解析:已被删除
考虑经典套路,二分一个答案
总时间复杂度为
namespace ttq012 {
int h[N], x[N];
void run() {
int T = read();
while (T--) {
int n = read(), m = read(), k = read();
for (int i = 1; i <= n; ++i) {
h[i] = read();
}
for (int i = 1; i <= n; ++i) {
x[i] = read();
}
int l = 1, r = inf, best = -1;
while (l <= r) {
int mid = l + r >> 1;
vector<pair<int, int>> event;
for (int i = 1; i <= n; ++i) {
int pwk = (h[i] + mid - 1) / mid;
if (pwk <= m) {
int L = x[i] - (m - pwk), R = x[i] + (m - pwk);
event.eb(L, 1), event.eb(R + 1, -1);
}
}
sort(event.begin(), event.end(), [&](auto l, auto r) {
return l.first < r.first || l.first == r.first && l.second < r.second;
}) ;
int pref = 0, ok = 0;
for (auto &[pos, vx] : event) {
if ((pref += vx) >= k) {
ok = 1;
break;
}
}
if (ok) {
best = mid, r = mid - 1;
} else {
l = mid + 1;
}
}
cout << best << '\n';
}
} }
G
看到
但是直接转移时间复杂度为
( ) ,
欧拉线性筛出
namespace ttq012 {
int a[N], mu[N], idx, pr[N], isp[N];
void sieve(int n) {
isp[1] = 1, mu[1] = 1;
for (int i = 2; i < n; ++i) {
if (!isp[i]) {
pr[++idx] = i, mu[i] = -1;
}
for (int j = 1; j <= idx && i * pr[j] < n; ++j) {
int k = i * pr[j];
isp[k] = 1;
if (i % pr[j] == 0) {
mu[k] = 0;
break;
} else {
mu[k] = -mu[i];
}
}
}
}
int f[N], g[N];
void run() {
sieve(N);
int n = read();
for (int i = 1; i <= n; ++i) {
a[i] = read();
}
for (int i = 1; i <= n; ++i) {
vector<int> fact;
for (int j = 2; j * j <= a[i]; ++j) {
if (a[i] % j == 0) {
fact.eb(j);
if (j * j != a[i]) {
fact.eb(a[i] / j);
}
}
}
fact.eb(a[i]);
if (i == 1) {
f[i] = 1;
} else {
for (auto &x : fact) {
f[i] = (f[i] - mu[x] * g[x] % mod + mod) % mod;
}
}
for (auto &x : fact) {
g[x] = (g[x] + f[i]) % mod;
}
}
cout << f[n] << '\n';
} }
本文来自博客园,作者:yhbqwq,转载请注明原文链接:https://www.cnblogs.com/yhbqwq/p/18551495,谢谢QwQ
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 《HelloGitHub》第 107 期
· 全程使用 AI 从 0 到 1 写了个小工具
· 从文本到图像:SSE 如何助力 AI 内容实时呈现?(Typescript篇)