「赛后总结」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 淘淘与蓝蓝之克苏鲁跑团
思路
还没调完呢(
调完了再写(
代码
点击查看代码