☁️体验
E 感觉难度偏低了。赛时 5 题。
💡题解
A - Nowcoder Weekly Contest
题意
给出一个 ,判断是否参与牛客周赛的评级。根据规则,大于 就会 。
思路
直接判断即可。
代码
void solve(){ int n; cin >> n;
if(n >= 1600) D("Unrated"); else D("Rated");}B - ICPC Medal
题意
给出金银铜牌数量,分别为 。
个铜牌可以合成 个银牌, 个银牌可以合成 个金牌。其中,每合成 个金牌时都会掉落 个铜牌。
问最多可以有多少个金牌。
思路
按题意模拟即可。
代码
void solve(){ int a, b, c, x, y; cin >> a >> b >> c >> x >> y;
while(c >= x || b >= y) { b += c / x; c %= x; a += b / y; c += b / y; b %= y; }
D(a);}C - Unique Number
题意
给你一个初始化全 长度为 的数组。
你可以执行任意次操作:
选择一个右边界 ,将 全部增加 。
另外,有一个同样长的限制数组 ,每个对应的 都要满足 。
问数组 中最多可以有多少种不同的数。
思路
很明显,构造出来的 数组总是非递增的。
为了使后续能选的不同的数更多,左边的数应当尽可能大。所以, 我们直接取 是最优的。
为了给后续的数尽可能留更多的选择,同时还要保证种数更多。理想情况下,我们希望构造出来的数组 从左往右是依次减 的。
因此,我们做一件事就好:
代码
void solve(){ input(int, n, a);
int t = a[0], ans = 0;
for(int& i : a) { t = min(t, i); ans++; t--;
if(t < 0) break; }
D(ans);}D - Balanced Array
题意
有一个长度为 的数组 ,如果其子数组 满足:
那么就称 为平衡的。
问有多少个 满足平衡条件。
思路
对于子数组 , 如果一个右端点 是合法的,那么不难推出 均是合法的。因此,只要找到合法区间,答案就直接加上当前区间长度。
所以,用一个 动态维护滑动窗口即可。
代码
void solve(){ input(int, n, a);
int ans = 0, l = 0; map<int, int> f;
for(int r = 0; r < n; r++) { f[a[r]]++;
while(f.rbegin()->first - f.begin()->first > 1) { int x = a[l++]; if(--f[x] == 0) f.erase(x); }
ans += r - l + 1; }
D(ans);}E - Maximize The Sum
题意
有一个长度为 的数组 ,其中每个元素是 或 。
你可以执行任意次操作:
- 选择相邻的三个位置,它们的值分别为 ;
- 然后将它们同时替换为:
问最后 的数量最多可以有多少。
思路
我们可以分出以下 种情况:
显然,如果全为 '' 或 '',我们无法使数量增多,此时答案就是 或 ;
更普遍的情况,对于任意排列的三元组,它们总是可以变成 个 '' 和 个 '' 的组合。此时答案为 。
代码
void solve(){ int n; cin >> n; string s; cin >> s;
int t = ranges::count(s, '1');
if(t == n || t == 0) D(t); else D(n - 1);}F - Palindromic Value
题意
给你一个长度为 的字符串 。
每个回文子串的价值为其长度 的平方。
把 全部分割为回文子串,并记录方案价值
求所有方案价值之和并取模
思路
和 分别表示前缀 的回文分割方案数和所有回文方案价值总和。
中心扩展法预处理回文串。
如果 是回文串,那么有:
最后, 即为答案。
代码
void solve(){ int n; cin >> n; string s; cin >> s;
vector<vector<int>> ok(n + 1, vector<int>(n + 1)); for(int i = 0; i < n; i++) { int l = i, r = i; while(l >= 0 && r < n && s[l] == s[r]) { ok[l + 1][r + 1] = 1; l--, r++; } l = i, r = i + 1; while(l >= 0 && r < n && s[l] == s[r]) { ok[l + 1][r + 1] = 1; l--, r++; } }
vector<Z> cnt(n + 1), dp(n + 1); cnt[0] = 1; for(int i = 1; i <= n; i++) for(int j = 0; j < i; j++) if(ok[j + 1][i]) { cnt[i] += cnt[j]; dp[i] += dp[j] + cnt[j] * (i - j) * (i - j); }
D(dp[n]);}🎈模板
头文件
#include <bits/stdc++.h>#define vvcin(_x) for(auto& _e : _x) for(auto& _i : _e) cin >> _i#define vcin(_x) for(auto& _i : _x) cin >> _i#define input(_T, _n, _a) int _n; cin >> _n; vector<_T> _a(_n); vcin(_a)#define D(_x) cout << _x << endl#define vD(_x) for(int _i = 0; _i < _x.size(); ++_i) cout << (_x[_i]) << " \n"[_i == _x.size() - 1]#define vvD(_x) for(auto& _e : _x) vD(_e)#define vcin1(_x) for(int _i = 1; _i < _x.size(); ++_i) cin >> _x[_i]#define input1(_T, _n, _a) int _n; cin >> _n; vector<_T> _a(_n + 1); vcin1(_a)#define D1(_x) cout << "# " << _x << endl#define vD1(_x) for(int _i = 1; _i < _x.size(); ++_i) cout << (_x[_i]) << " \n"[_i == _x.size() - 1]#define YES cout << "YES" << endl#define NO cout << "NO" << endl#define Yes cout << "Yes" << endl#define No cout << "No" << endl#define yes cout << "yes" << endl#define no cout << "no" << endl#define all(_x) _x.begin(), _x.end()#define rall(_x) _x.rbegin(), _x.rend()#define INF LLONG_MAX#define inf INT_MAX#define endl '\n'#define int long longusing namespace std;typedef long long ll;constexpr int MOD = 1000000007;constexpr int mod = 998244353;
void solve(){
}
signed main(){ ios::sync_with_stdio(false); cin.tie(nullptr); int _ = 1;cin >> _; while (_--) solve(); return 0;}自动取模
constexpr int mod = 998244353;
template <class T>constexpr T ksm(T a, ll b) { T res = 1; while (b) { if (b & 1) res *= a; b >>= 1; a *= a; } return res;}
template <int P>struct MInt { int x; constexpr MInt() : x() {} constexpr MInt(ll x) : x{norm(x % getMod())} {} static int Mod; constexpr static int getMod() { if (P > 0) { return P; } else { return Mod; } } constexpr static void setMod(int Mod_) { Mod = Mod_; } constexpr int norm(int x) const { if (x < 0) { x += getMod(); } if (x >= getMod()) { x -= getMod(); } return x; } constexpr int val() const { return x; } explicit constexpr operator int() const { return x; } constexpr MInt operator-() const { MInt res; res.x = norm(getMod() - x); return res; } constexpr MInt inv() const { assert(x != 0); return ksm(*this, getMod() - 2); } constexpr MInt &operator*=(MInt rhs) & { x = 1LL * x * rhs.x % getMod(); return *this; } constexpr MInt &operator+=(MInt rhs) & { x = norm(x + rhs.x); return *this; } constexpr MInt &operator-=(MInt rhs) & { x = norm(x - rhs.x); return *this; } constexpr MInt &operator/=(MInt rhs) & { return *this *= rhs.inv(); } friend constexpr MInt operator*(MInt lhs, MInt rhs) { MInt res = lhs; res *= rhs; return res; } friend constexpr MInt operator+(MInt lhs, MInt rhs) { MInt res = lhs; res += rhs; return res; } friend constexpr MInt operator-(MInt lhs, MInt rhs) { MInt res = lhs; res -= rhs; return res; } friend constexpr MInt operator/(MInt lhs, MInt rhs) { MInt res = lhs; res /= rhs; return res; } friend constexpr istream &operator>>(istream &is, MInt &a) { ll v; is >> v; a = MInt(v); return is; } friend constexpr ostream &operator<<(ostream &os, const MInt &a) { return os << a.val(); } friend constexpr bool operator==(MInt lhs, MInt rhs) { return lhs.val() == rhs.val(); } friend constexpr bool operator!=(MInt lhs, MInt rhs) { return lhs.val() != rhs.val(); }};
template <>int MInt<0>::Mod = 998244353;
template <int V, int P>constexpr MInt<P> CInv = MInt<P>(V).inv();
using Z = MInt<mod>;如果这篇文章对你有帮助,欢迎分享给更多人!
部分信息可能已经过时



