CSP-S 2024 游记 / 游寄
Day \(-\texttt{?}\)
中午
地点:机房。
新的赛季从初赛开始。
说实话,打心底没重视初赛。中午在机房听说早上 J 组送分送到家了,水到飞起。考后第一时间 QQ 群就传出来的偷拍版真题?某机构泄题的?重生之监考老师是我宿管?罚坐之考场上偷拍监考老师发呆?……没啥波澜,不做评价。
下午
地点:考场,和去年同一个学校。
又在监考老师面前贴脸?下午 S 组也很简单,没有一题是蒙的。完形填空 \(9\) 个 \(\mathtt{C}\) 里面夹着一个 \(\mathtt{A}\)?没有取等的快速排序?
其他没什么印象,感觉和之前做过的题完全不一样,太水了。
归程
地点:大巴。
校对了一下感觉良好。差一点就 AK 了,可惜最后一道选择题计数少数了一个(雾)。但凡 \(\Theta(m^2)\) 模拟也不会这样……
还好总算稳过初赛了。没啥好炫耀的,毕竟这么简单嘛。\(98\) 分稳稳的。不完而美?
Day \(-1\)
早上
地点:教室、机房。
前一天晚上问了别的同学家长,说要 \(7: 00\) 到赶早读。我赶了,结果愣是没瞧见他们人。我以为他们此时正在机房里头复习呢。估计过一会去机房还要被嘲讽:“去教室早读,那么认真啊。”……算了无所谓,在教室里先把朱自清的《荷塘月色》背下来先。
到了机房。没人???吓得我赶紧把手机装上电话卡,正想打电话确认一下,是不是他们在我早读时,丢下我出发了(独孤月代入感),冲进来一只猫,还质问我为什么这么早来……晕,合着是我最早到的。
毕竟晚上、明天还有时间,早上不打算复习。搞了一会 Github 的学生认证,发现手头的资料都没有注明入学时间,也就放弃了。
中午、下午
地点:大巴。
有人身份证忘带了?幸好市民卡及时送到了。第一次看到知临新校,接上了霸气的帝王蟹。
路上和小河长坐一起。没啥事干,就糊里糊涂到了酒店。
晚上
地点:酒店、饭店。
前台搞入住搞了一会。之前说和 CPP 睡的,其实是和线段树大哥一个房间。一个房间到房间放了东西就准备吃饭去了。看着 CPP 领着初三学弟去吃饭。我吃了肉夹馍和一碗番茄鸡蛋面。
回到酒店,六点多先洗了个澡,然后去串门。说是说复习,其实是刷视频去了(?
迟了,回到房间,刚想刷牙,碰到 CPP 来收缴手坤,痛失。
然后就睡了?(空调的灯好亮啊!睡不着……)
Day \(0\)
早上
地点:酒店。
早上和线段树大哥 \(6:20\) 左右起床,去吃了早饭。早饭没啥好吃的,也可能是我胃口不太好。
吃完饭又回到房间里去了,无聊(?)刷了亿会视频。
???我去,十点多了,要不要复习的啊!
赶紧去猫的房间里看 My Experience。看到一半笔记本水土不服花屏了……重启不显示?气……拿出手机,卡得要死。却发现七分钟前 CPP 叫我们去吃中饭了,那就走吧。
中午
地点:饭店、酒店。
我 TM 手机真的废物啊(爷爷用剩下的……),冬妮娅吃完饭了,我小程序点餐界面还没进去……晕,只好求助于猫猫。发红包也操作了好久……
赶回酒店,准备出发。收拾好了自己的东西,以及线段树大哥的东西。下楼,退房。
碰见流一地了,大家在讨论早上的 J 组。没认真看,随便胡了几题,也不知道对不对。
坐车去考场,要先放行李。在车屁股后面捣鼓半天,塞不进去,司机一来,把行李一立起来就进去了……还被嘲讽了,雾。
下午
地点:考点。
到了考点,CPP 先给我们合了一张影。烟雨迷蒙,是个写随笔的题材(?)。
提前到了,在楼下等着开门。人真多啊,肩并肩密密地挨着(朱自清乱入)。又碰到流一地了,大家在一起聊了一会,就进去了。
坐电梯上去的,上了个厕所就进考场了。
罚坐……艰难地罚坐……终于可以看考生须知了……终于可以打开第一层压缩包了……终于给试题 PDF 的密码了!
看了一下,T1 感觉不难。代码敲出来,改一改,我去,这不就是求出现最多的数字出现的次数吗?哎,去年 T1 也是水题,但是数组开小了……算了,回过头再对拍吧。\(11\)min 过了 T1。
T2 物理题,加速度,不难,对于每个 \(i\),找到 \([l_i, r_i]\) 至少有一个选择,是原题弱化版,公式怕推错,推了好久。\(54\)min 过了。
开了 T3,染色问题,一眼 DP,敲了 \(\Theta(n^2)\),然后优化 \(\Theta(n)\),秒了,用了 \(37\)min。
\(15:58\) 发现样例解释错了,举手和监考老师说,老师说不解答题目问题。行吧,反正我会写正解。
看 T4,没头绪,打了特殊性质 AB,前去拍前面的了。T1 T2 不想拍,也不好拍,T3 打过暴力,简单拍了一下,没啥问题,就怕 \(\Theta(n^2)\) 写错了……考完想想没打 \(\Theta(2^n)\) 有些不应该,可能太自信了吧?
之后分数没有变化过……没检查出来什么脑瘫错误,交卷了。
T1 | T2 | T3 | T4 |
---|---|---|---|
\(11\)min | \(54\)min | \(37\)min | NAN |
\(14:44\) | \(15:38\) | \(16:15\) | NAN |
\(100\)pts | \(100\)pts | \(100\)pts | \(40\)pts |
\(452\)B | \(1786\)B | \(1658\)B | \(4675\)B |
\(100 + 100 + 100 + 40 = 340\) 还行吧?只要不挂分的话……
平均 \(42\) 秒获得一分。
一道图论都没有,DP 倒是有两题(也许 T2 算半个 DP 吧)。
晚上
地点:大巴。
WTF,最后一题 \(\leq 8\) 没打……该死……
吃完晚饭,不知道干啥。
发现左边小河长看番,加入了进去。几个小时下来,看爽了……脖子都有些酸。手机快没电了,又一起听了会歌,就到学校了。
回家,睡觉!
Day \(1\)
早上
地点:学校。
CPP 说 \(9\) 点前到学校,但是 \(6\) 点就醒了,无聊发了会呆。
到了学校,洛谷前三题有民间数据了,敲了敲 \(300\)pts 拿到手了。发现敲完后 T4 有数据了,不是很想打,黑题……
Day \(9\)
CCF 诈骗:\(5\) 号中午 \(13:00\) \(\rightarrow\) \(4\) 号中午 \(13:00\) \(\rightarrow\) \(4\) 号下午 \(16:00\) \(\rightarrow\) \(4\) 号下午 \(17:30\)。
敲了会电子木鱼。出成绩了!没挂分,应该有 1= 吧?(
T1
赛时代码
#include <iostream>
#include <cstdio>
using namespace std;
const int N = 100010;
int n, r[N], buc[N];
int rem;
signed main() {
#ifndef XuYueming
freopen("duel.in", "r", stdin);
freopen("duel.out", "w", stdout);
#endif
scanf("%d", &n);
for (int i = 1; i <= n; ++i) {
scanf("%d", &r[i]);
++buc[r[i]];
}
for (int i = 1; i <= 100000; ++i) {
if (buc[i] >= rem)
rem = buc[i];
}
printf("%d", rem);
return 0;
}
估分代码
#include <cstdio>
#include <iostream>
using namespace std;
const int N = 100010;
int n, v[N], buc[N], rem;
signed main() {
scanf("%d", &n);
for (int i = 1; i <= n; ++i)
scanf("%d", &v[i]), ++buc[v[i]];
for (int i = 1; i <= 100000; ++i)
if (buc[i] >= rem)
rem = buc[i];
printf("%d", rem);
return 0;
}
T2
赛时代码
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
const int N = 100010;
int n, m, len, V;
int d[N], v[N], a[N];
int p[N], L[N], R[N];
int mxL[N], dp[N];
inline long long CEIL(long long a, long long b) {
if (b < 0) b = -b, a = -a;
if (a > 0) return (a - 1) / b + 1;
return a / b;
}
void solve() {
scanf("%d%d%d%d", &n, &m, &len, &V);
for (int i = 1; i <= n; ++i) {
scanf("%d%d%d", &d[i], &v[i], &a[i]);
}
for (int i = 1; i <= m; ++i) {
scanf("%d", &p[i]);
mxL[i] = 0;
dp[i] = 0;
}
dp[m + 1] = 0;
int cnt = 0;
for (int i = 1; i <= n; ++i) {
int rin, rout;
if (a[i] > 0) {
if (v[i] > V) {
rin = d[i], rout = len;
} else {
rin = min((len + 1) * 1ll,
d[i] +
(2ll * v[i] * (V - v[i]) + 1ll * (V - v[i]) * (V - v[i])) / (2ll * a[i])
+1ll
);
rout = len;
}
} else if (a[i] < 0) {
if (v[i] <= V) continue;
rin = d[i];
rout = min(1ll * len,
d[i] +
CEIL(2ll * v[i] * (V - v[i]) + 1ll * (V - v[i]) * (V - v[i]), 2ll * a[i])
-1ll
);
} else {
if (v[i] <= V) continue;
rin = d[i], rout = len;
}
if (rin > rout) continue;
L[i] = lower_bound(p + 1, p + m + 1, rin) - p;
R[i] = upper_bound(p + 1, p + m + 1, rout) - p - 1;
if (L[i] > m || L[i] > R[i]) continue;
++cnt;
mxL[R[i]] = max(mxL[R[i]], L[i]);
}
for (int i = 1; i <= m; ++i)
mxL[i] = max(mxL[i], mxL[i - 1]);
for (int i = 1; i <= m + 1; ++i) {
dp[i] = dp[mxL[i - 1]] + 1;
}
printf("%d %d\n", cnt, m - dp[m + 1] + 1);
}
signed main() {
#ifndef XuYueming
freopen("detect.in", "r", stdin);
freopen("detect.out", "w", stdout);
#endif
int t; scanf("%d", &t);
while (t--) solve();
return 0;
}
估分代码
#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 100010;
int n, m, len, V;
int d[N], v[N], a[N];
int L[N], R[N], p[N];
int mxL[N], dp[N];
inline long long CEIL(long long a, long long b) {
if (b < 0) a = -a, b = -b;
if (a > 0) return (a - 1) / b + 1;
return a / b;
}
void solve() {
scanf("%d%d%d%d", &n, &m, &len, &V);
for (int i = 1; i <= n; ++i) {
scanf("%d%d%d", &d[i], &v[i], &a[i]);
}
for (int i = 1; i <= m; ++i) {
scanf("%d", &p[i]);
mxL[i] = dp[i] = 0;
}
dp[m + 1] = 0;
sort(p + 1, p + m + 1);
int cnt = 0;
for (int i = 1; i <= n; ++i) {
int rin, rout;
if (a[i] == 0) {
if (v[i] <= V) continue;
rin = d[i], rout = len;
} else if (a[i] > 0) {
if (v[i] > V) {
rin = d[i], rout = len;
} else {
rin = min(1ll * (len + 1),
d[i] +
(2ll * v[i] * (V - v[i]) + 1ll * (V - v[i]) * (V - v[i])) / (2ll * a[i])
+ 1
);
rout = len;
}
} else {
if (v[i] <= V) continue;
rin = d[i];
rout = max(1ll * d[i],
d[i] +
CEIL(2ll * v[i] * (V - v[i]) + 1ll * (V - v[i]) * (V - v[i]), 2ll * a[i])
- 1
);
}
if (rin > rout) continue;
L[i] = lower_bound(p + 1, p + m + 1, rin) - p;
R[i] = upper_bound(p + 1, p + m + 1, rout) - p - 1;
if (L[i] > m || L[i] > R[i]) continue;
++cnt;
mxL[R[i]] = max(mxL[R[i]], L[i]);
}
for (int i = 1; i <= m; ++i) {
mxL[i] = max(mxL[i], mxL[i - 1]);
}
for (int i = 1; i <= m + 1; ++i) {
dp[i] = dp[mxL[i - 1]] + 1;
}
printf("%d %d\n", cnt, m - dp[m + 1] + 1);
}
signed main() {
int t; scanf("%d", &t);
while (t--) solve();
return 0;
}
T3
赛时代码
#include <iostream>
#include <cstdio>
using namespace std;
const int N = 200010;
const int M = 1000010;
using lint = long long;
int n, v[N];
namespace O_N2 {
const int N = 2010;
lint dp[N];
lint sum[N];
inline bool check() {
return n <= 2000;
}
void solve() {
for (int i = 1; i <= n; ++i) {
sum[i] = 0;
dp[i] = 0;
}
for (int i = 2; i <= n; ++i) {
sum[i] = sum[i - 1];
if (v[i] == v[i - 1]) sum[i] += v[i];
}
for (int i = 1; i <= n; ++i) {
for (int j = 0; j < i; ++j) {
dp[i] = max(dp[i], dp[j] +
sum[i] - sum[j + 1] +
(v[i + 1] == v[j] ? v[j] : 0)
);
}
}
lint ans = dp[n];
printf("%lld\n", ans);
}
}
namespace xymakioi {
lint dp[N], sum[N], mx[M];
const lint inf = 0x3f3f3f3f3f3f3f3f;
void solve() {
for (int i = 1; i <= n; ++i) {
sum[i] = 0;
dp[i] = 0;
mx[v[i]] = -inf;
}
mx[0] = -inf;
for (int i = 2; i <= n; ++i) {
sum[i] = sum[i - 1];
if (v[i] == v[i - 1]) sum[i] += v[i];
}
lint pre_max = 0;
for (int i = 1; i <= n; ++i) {
dp[i] = max(pre_max, mx[v[i + 1]]) + sum[i];
pre_max = max(pre_max, dp[i] - sum[i + 1]);
mx[v[i]] = max(mx[v[i]], dp[i] - sum[i + 1] + v[i]);
}
lint ans = dp[n];
printf("%lld\n", ans);
}
}
void solve() {
scanf("%d", &n);
for (int i = 1; i <= n; ++i) {
scanf("%d", &v[i]);
}
if (O_N2::check()) return O_N2::solve();
xymakioi::solve();
}
signed main() {
#ifndef XuYueming
freopen("color.in", "r", stdin);
freopen("color.out", "w", stdout);
#endif
int t; scanf("%d", &t);
while (t--) solve();
return 0;
}
估分代码
#include <cstdio>
#include <iostream>
using namespace std;
const int N = 200010;
const int M = 1000010;
using lint = long long;
const lint inf = 0x3f3f3f3f3f3f3f3f;
int n, v[N];
lint mxv[M], dp[N], sum[N];
void solve() {
scanf("%d", &n);
for (int i = 1; i <= n; ++i) {
scanf("%d", &v[i]);
dp[i] = -inf;
mxv[v[i]] = -inf;
sum[i] = 0;
}
v[n + 1] = 0;
mxv[0] = -inf;
for (int i = 2; i <= n; ++i) {
sum[i] = sum[i - 1];
if (v[i] == v[i - 1])
sum[i] += v[i];
}
lint pre_max = 0;
for (int i = 1; i <= n; ++i) {
dp[i] = max(pre_max, mxv[v[i + 1]]) + sum[i];
pre_max = max(pre_max, dp[i] - sum[i + 1]);
mxv[v[i]] = max(mxv[v[i]], dp[i] - sum[i + 1] + v[i]);
}
printf("%lld\n", dp[n]);
}
signed main() {
int t; scanf("%d", &t);
while (t--) solve();
return 0;
}
/*
dp[i] = max(dp[j] + sum[i] - sum[j + 1])
*/
T4
赛时代码
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
using namespace std;
const int N = 150010;
const int lgN = 18;
using lint = long long;
int n, m, K, T;
int _a[N];
char d[lgN][N];
int _x[4], a[N];
struct Question {
int t, idx;
} q[N];
namespace A {
inline bool check() {
if (T != 1) return false;
for (int i = 1; i <= m; ++i)
if (q[i].t != (q[i].t & -q[i].t))
return false;
return true;
}
int val[N];
inline int add(int l, int r, bool o, int t) {
if (o) swap(l, r);
if (a[l] >= t) return l;
return r;
}
void solve() {
lint ans = 0;
for (int _ = 1; _ <= m; ++_) {
if (_ > 1 && q[_].t == q[_ - 1].t) {
ans ^= val[1] * q[_].idx;
continue;
}
int s = q[_].t, k = 0;
while (1 << k < s) ++k;
for (int i = 1; i <= s; ++i)
val[i] = i;
for (int __ = 1; __ <= k; ++__) {
int rem = 1 << (k - __);
for (int i = 1; i <= rem; ++i) {
int ls = (i - 1) << 1 | 1;
int rs = i << 1;
val[i] = add(val[ls], val[rs], d[__][i] == '1', __);
}
}
ans ^= 1ll * val[1] * q[_].idx;
}
printf("%lld\n", ans);
}
}
namespace B {
inline bool check() {
return n <= 5000 && m <= 5000;
}
struct node {
int cid;
lint sum;
};
node val[N];
inline node add(node x, node y, bool o, int t) {
if (o) swap(x, y);
if (x.cid && !x.sum) {
if (a[x.cid] >= t)
return x;
return y;
}
if (x.sum && !x.cid) {
return { y.cid, x.sum + y.sum };
}
if (!y.cid) {
if (a[x.cid] >= t)
return { x.cid, x.sum + y.sum };
return { 0, x.sum + y.sum };
}
// if (a[x.cid] >= t);
return { x.cid | y.cid, x.sum };
}
void solve() {
lint ans = 0;
for (int _ = 1; _ <= m; ++_) {
if (_ > 1 && q[_].t == q[_ - 1].t) {
ans ^= (val[1].cid + val[1].sum) * q[_].idx;
continue;
}
int s = q[_].t, k = 0;
while (1 << k < s) ++k;
for (int i = 1; i <= 1 << k; ++i) {
if (i <= s)
val[i] = { i, 0 };
else
val[i] = { 0, i };
}
for (int __ = 1; __ <= k; ++__) {
int rem = 1 << (k - __);
for (int i = 1; i <= rem; ++i) {
int ls = (i - 1) << 1 | 1;
int rs = i << 1;
val[i] = add(val[ls], val[rs], d[__][i] == '1', __);
}
}
ans ^= 1ll * (val[1].cid + val[1].sum) * q[_].idx;
}
printf("%lld\n", ans);
}
}
namespace C {
inline bool check() {
return true;
}
struct node {
int cid;
lint sum;
};
node val[N << 1];
inline node add(node x, node y, bool o, int t) {
if (o) swap(x, y);
if (x.cid && !x.sum) {
if (a[x.cid] >= t)
return x;
return y;
}
if (x.sum && !x.cid) {
return { y.cid, x.sum + y.sum };
}
if (!y.cid) {
if (a[x.cid] >= t)
return { x.cid, x.sum + y.sum };
return { 0, x.sum + y.sum };
}
// if (a[x.cid] >= t);
return { x.cid | y.cid, x.sum };
}
void upd(int u, int bf, int t) {
if (t != 1)
val[u] = add(val[u << 1], val[u << 1 | 1], d[t - 1][bf + 1] == '1', t - 1);
if (u == 1) return;
upd(u >> 1, bf >> 1, t + 1);
}
lint getans(int u, int bf) {
if (!bf) return val[u].cid + val[u].sum;
return getans(u >> 1, bf >> 1);
}
vector<int> qry[N];
void solve() {
lint ans = 0;
for (int i = 1; i <= 1 << (K + 1); ++i)
val[i] = { 0, 0 };
for (int i = 1; i <= 1 << K; ++i) {
val[(1 << K) - 1 + i] = { 0, i };
upd((1 << K) - 1 + i, i - 1, 1);
}
for (int i = 1; i <= n; ++i)
qry[i].clear();
for (int i = 1; i <= m; ++i)
qry[q[i].t].emplace_back(i);
for (int i = 1; i <= n; ++i) {
val[(1 << K) - 1 + i] = { i, 0 };
upd((1 << K) - 1 + i, i - 1, 1);
lint res = getans((1 << K) - 1 + i, i - 1);
for (int o: qry[i])
ans ^= 1ll * res * q[o].idx;
}
printf("%lld\n", ans);
}
}
void solve() {
scanf("%d%d%d%d", &_x[0], &_x[1], &_x[2], &_x[3]);
for (int i = 1; i <= n; ++i) a[i] = _a[i] ^ _x[i & 3];
if (A::check()) return A::solve();
if (B::check()) return B::solve();
if (C::check()) return C::solve();
throw -1;
}
signed main() {
#ifndef XuYueming
freopen("arena.in", "r", stdin);
freopen("arena.out", "w", stdout);
#endif
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; ++i)
scanf("%d", &_a[i]);
for (int i = 1; i <= m; ++i)
scanf("%d", &q[i].t), q[i].idx = i;
sort(q + 1, q + m + 1, [] (const Question& a, const Question& b) -> bool {
return a.t < b.t;
});
while (1 << K < n) ++K;
for (int i = 1; i <= K; ++i)
scanf("%s", d[i] + 1);
scanf("%d", &T); int _ = T;
while (_--) solve();
return 0;
}
估分代码
[404 not found].
本文作者:XuYueming,转载请注明原文链接:https://www.cnblogs.com/XuYueming/p/18502198。
若未作特殊说明,本作品采用 知识共享署名-非商业性使用 4.0 国际许可协议 进行许可。