mobile wallpaper 1
797 字
2 分钟
牛客周赛 Round 134
2026-03-09

☁️体验#

E 感觉难度偏低了。赛时 5 题。

💡题解#

A - Nowcoder Weekly Contest#

题意#

给出一个 RatingRating,判断是否参与牛客周赛的评级。根据规则,大于 15991599 就会 UnratedUnrated

思路#

直接判断即可。

代码#

void solve()
{
int n;
cin >> n;
if(n >= 1600) D("Unrated");
else D("Rated");
}

B - ICPC Medal#

题意#

给出金银铜牌数量,分别为 a,b,ca, b, c

xx 个铜牌可以合成 11 个银牌,yy 个银牌可以合成 11 个金牌。其中,每合成 11 个金牌时都会掉落 11 个铜牌。

问最多可以有多少个金牌。

思路#

按题意模拟即可。

代码#

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#

题意#

给你一个初始化全 00 长度为 nn 的数组。

你可以执行任意次操作:

选择一个右边界 rr,将 a1,a2,...,ara_1, a_2, ... , a_r 全部增加 11

另外,有一个同样长的限制数组 dd,每个对应的 aia_i 都要满足 aidia_i \leq d_i

问数组 aa 中最多可以有多少种不同的数。

思路#

很明显,构造出来的 aa 数组总是非递增的。

为了使后续能选的不同的数更多,左边的数应当尽可能大。所以,a1a_1 我们直接取 d1d_1 是最优的。

为了给后续的数尽可能留更多的选择,同时还要保证种数更多。理想情况下,我们希望构造出来的数组 aa 从左往右是依次减 11 的。

因此,我们做一件事就好:

能选多大选多大能选多大选多大

代码#

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#

题意#

有一个长度为 nn 的数组 aa,如果其子数组 (l,r)=al,al+1,,ar1,ar(l, r) = a_l, a_{l+1}, \dots, a_{r-1}, a_r 满足:

max(l,r)min(l,r)<=1\max(l, r) - \min(l, r) <= 1

那么就称 (l,r)(l, r) 为平衡的。

问有多少个 (l,r)(l, r) 满足平衡条件。

思路#

对于子数组 (l,r)(l, r), 如果一个右端点 rr 是合法的,那么不难推出 (l,r),(l+1,r),,(r1,r),(r,r)(l, r), (l+1, r), \dots, (r-1, r), (r, r) 均是合法的。因此,只要找到合法区间,答案就直接加上当前区间长度。

所以,用一个 mapmap 动态维护滑动窗口即可。

代码#

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#

题意#

有一个长度为 nn 的数组 a1,a2,,ana1,a2,\dots,a_n​,其中每个元素是 0011

你可以执行任意次操作:

  • 选择相邻的三个位置,它们的值分别为 x,y,zx, y, z
  • 然后将它们同时替换为:
    • x=xyx^{'} = x \oplus y
    • y=yzy^{'} = y \oplus z
    • z=xzz^{'} = x \oplus z

问最后 11 的数量最多可以有多少。

思路#

我们可以分出以下 88 种情况:

  • 111000111 \rightarrow 000
  • 011101011 \rightarrow 101
  • 101110101 \rightarrow 110
  • 110011110 \rightarrow 011
  • 001011001 \rightarrow 011
  • 100101100 \rightarrow 101
  • 010110010 \rightarrow 110
  • 000000000 \rightarrow 000

显然,如果全为 '11' 或 '00',我们无法使数量增多,此时答案就是 nn00

更普遍的情况,对于任意排列的三元组,它们总是可以变成 22 个 '11' 和 11 个 '00' 的组合。此时答案为 n1n - 1

代码#

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#

题意#

给你一个长度为 nn 的字符串 ss

每个回文子串的价值为其长度 t|t| 的平方。

ss 全部分割为回文子串,并记录方案价值 t2\sum |t|^2

求所有方案价值之和并取模 t2mod998244353\sum \sum |t| ^ 2 \mod 998244353

思路#

cntcntdpdp 分别表示前缀 s[1i]s[1 \dots i] 的回文分割方案数和所有回文方案价值总和。

中心扩展法预处理回文串。

如果 s[lr]s[l \dots r] 是回文串,那么有:

  • cnt[r]+=cnt[l]cnt[r] += cnt[l]
  • dp[i]+=dp[j]+cnt[j](ij)2dp[i] += dp[j] + cnt[j] * (i - j)^2

最后,dp[n]dp[n] 即为答案。

代码#

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 long
using 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>;
分享

如果这篇文章对你有帮助,欢迎分享给更多人!

牛客周赛 Round 134
https://blog.hycode.qzz.io/posts/nk-weekly-134/post/
作者
Hycode
发布于
2026-03-09
许可协议
CC BY-NC-SA 4.0

部分信息可能已经过时

目录