「赛后总结」20221028 CSP 模拟赛

「赛后总结」20221022 CSP 模拟赛

点击查看目录

赛时

又垫底了。

光速过掉了 T1,光速过掉了 T2。

开始刚 T3,推出了式子,但调了 2h 没调出来。

最后只有 \(\text{222pts}\), 悲。

不过好像并没有挂不该挂的分,所以没有化学方程式。

题解

T1 淘淘与蓝蓝之哔哩哔哩

思路

模拟。

没了。

代码

点击查看代码
namespace SOLVE {
	typedef long double ldb;
	typedef long long ll;
	typedef double db;
	const ll N = 210;
	ll n, ans1, ans2;std::string s;
	inline ll rnt () {
		ll x = 0, w = 1; char c = getchar ();
		while (!isdigit (c)) { if (c == '-') w = -1; c = getchar (); }
		while (isdigit (c)) x = (x << 3) + (x << 1) + (c ^ 48), c = getchar ();
		return x * w;
	}
	inline void In () {
		n = rnt ();
		_for (i, 1, n) {
			std::getline (std::cin, s);
			ll m = s.length (), cnt = 0, CNT = 0;
			_for (i, 0, m - 1) {
				cnt += ('a' <= s[i] && s[i] <= 'z');
				CNT += ('A' <= s[i] && s[i] <= 'Z');
			}
			ans1 += ((CNT > cnt) || ('A' <= s[0] && s[0] <= 'Z'));
			ans2 += (isdigit (s[m - 1]) && !(cnt & 1));
		}
		return;
	}
	inline void Out () {
		printf ("%lld %lld\n", ans1, ans2);
		return;
	}
}

T2 数数

思路

\(cnt_{i,j}\) 表示最高位为 \(i\),最低位为 \(j\) 的数字个数,直接 \(\Theta(n)\) 预处理。

然后答案是:

\[\sum_{i=0}^{9}\sum_{j=0}^{9}cnt_{i,j}\times cnt_{j,i} \]

代码

点击查看代码
namespace SOLVE {
	typedef long double ldb;
	typedef long long ll;
	typedef double db;
	const ll N = 10;
	ll n, cnt[N][N], ans;
	inline ll rnt () {
		ll x = 0, w = 1; char c = getchar ();
		while (!isdigit (c)) { if (c == '-') w = -1; c = getchar (); }
		while (isdigit (c)) x = (x << 3) + (x << 1) + (c ^ 48), c = getchar ();
		return x * w;
	}
	inline void GetHeadAndTail (ll num, ll& x, ll& y) {
		x = num % 10;
		while (num > 9) num /= 10;
		y = num;
		return;
	}
	inline void In () {
		n = rnt ();
		return;
	}
	inline void Solve () {
		_for (i, 1, n) {
			ll x, y;
			GetHeadAndTail (i, x, y);
			++cnt[x][y];
		}
		_for (i, 0, 9) _for (j, 0, 9)
			ans += cnt[i][j] * cnt[j][i];
		return;
	}
	inline void Out () {
		printf ("%lld\n", ans);
		return;
	}
}

T3 淘淘与蓝蓝之节奏光剑

思路

DP 题,但细节巨多。

不知道为什么在 xuany 手下变成小清新 DP 了。

\(f_{i,j}\) 表示第 \(i\) 回合失误了第 \(j\) 次的最大分数。

简单推一下转移方程:

\[\begin{aligned} f_{i,j} &=\max_{1\le k<i}\{f_{k,j-1}+(s_{i-1}-s_{k})+(s_{i-1}-s_{k+1})+2*(s_{i-1}-s_{k+2})+4*(s_{i-1}-s_{k+3})\}\\ &=\max_{1\le k<i}\{f_{k,j-1}+s_{i-1}-s_{k}+s_{i-1}-s_{k+1}+2*s_{i-1}-2*s_{k+2}+4*s_{i-1}-4*s_{k+3}\}\\ &=\max_{1\le k<i}\{f_{k,j-1}+8*s_{i-1}-s_{k}-s_{k+1}-2*s_{k+2}-4*s_{k+3}\}\\ &=\max_{1\le k<i}\{f_{k,j-1}-s_{k}-s_{k+1}-2*s_{k+2}-4*s_{k+3}\}+8*s_{i-1}\\ \end{aligned} \]

维护一下 \(\max\) 这部分,就可以转移了。

代码

点击查看代码
namespace SOLVE {
	typedef long double ldb;
	typedef long long ll;
	typedef double db;
	const ll N = 1e5 + 10;
	ll T, n, m, k[N], a[N][10], res[N];
	ll s[N], la[60], f[N][60], ans;
	inline ll rnt () {
		ll x = 0, w = 1; char c = getchar ();
		while (!isdigit (c)) { if (c == '-') w = -1; c = getchar (); }
		while (isdigit (c)) x = (x << 3) + (x << 1) + (c ^ 48), c = getchar ();
		return x * w;
	}
	inline ll GetCnt (ll a, ll b) {
		ll cnt = 0;
		if (a <= b) cnt += res[a];
		if (a < b) cnt += 2 * res[a + 1];
		if (a + 1 < b) cnt += 4 * res[a + 2];
		if (a + 2 < b) cnt += 8 * (s[b] - s[a + 2]);
		return cnt;
	}
	inline void In () {
		n = rnt (), m = rnt ();
		_for (i, 1, n) {
			k[i] = rnt ();
			res[i] = 0;
			_for (j, 1, k[i]) {
				a[i][j] = rnt ();
				res[i] += a[i][j];
			}
			s[i] = s[i - 1] + res[i];
		}
		return;
	}
	inline void Solve () {
		memset (la, -0x3f, sizeof (la));
		ans = 0;
		la[0] = -s[1] - 2 * s[2] - 4 * s[3];
		_for (i, 1, n) {
			if (i <= 4) {
				f[i][0] = f[i - 1][0] + (1 << (i - 1)) * res[i];
				f[i][1] = f[i - 1][0];
			}
			else {
				ll k = i - 4;
				f[i][0] = GetCnt (1, i);
				_for (j, 1, m) {
					if (4 * j - 3 > i) break;
					f[i][j] = la[j - 1] + 8 * s[i - 1];
					ll another = f[k][j - 1] + res[k + 1] + 2 * res[k + 2] + 4 * res[k + 3];
					f[i][j] = std::max (f[i][j], another);
				}
				_for (j, 0, m) {
					if (4 * j - 3 > k) break;
					la[j] = std::max (la[j], f[k][j] - s[k] - s[k + 1] - 2 * s[k + 2] - 4 * s[k + 3]);
				}
			}
			if (4 * m - 3 > i) continue;
			ans = std::max (ans, f[i][m] + GetCnt (i + 1, n));
		}
		return;
	}
	inline void Out () {
		printf ("%lld\n", ans);
		return;
	}
}

T4 淘淘与蓝蓝之克苏鲁跑团

思路

还没调完呢(

调完了再写(

代码

点击查看代码

posted @ 2022-10-28 19:04  K8He  阅读(37)  评论(2编辑  收藏  举报