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].

posted @ 2024-10-25 22:36  XuYueming  阅读(103)  评论(0编辑  收藏  举报