2025/09/04 练习
C. Beautiful Sequence
题意:找到 \([1,2,2\dots ,2,3]\) 的子序列个数,结果对 \(998244353\) 取模。
利用动态规划解决
点击查看代码
#include<bits/stdc++.h>
using namespace std;
const int MOD = 998244353;
void solve(){
int n;
cin >> n;
vector<int> a(n);
for(int i = 0;i < n;i++){
cin >> a[i];
}
vector<int> dp(4, 0);
for(int i = 0;i < n;i++){
if(a[i] == 1){
dp[1] = (dp[1] + 1LL) % MOD;
}else if(a[i] == 2){
dp[2] = dp[2] * 2LL % MOD;
dp[2] = (dp[1] + dp[2]) % MOD;
}else{
dp[3] = (dp[3] + dp[2]) % MOD;
}
}
cout << dp[3] << "\n";
}
int main(){
int T = 1;
cin >> T;
while(T--){
solve();
}
return 0;
}
简化代码
点击查看代码
#include<bits/stdc++.h>
using namespace std;
const int MOD = 998244353;
void solve(){
int n;
cin >> n;
vector<int> a(n);
for(int i = 0;i < n;i++){
cin >> a[i];
}
vector<int> dp(4, 0);
for(int i = 0;i < n;i++){
if(a[i] == 1){
dp[1] = (dp[1] + 1LL) % MOD;
}else if(a[i] == 2){
dp[2] = dp[2] * 2LL % MOD;
dp[2] = (dp[1] + dp[2]) % MOD;
}else{
dp[3] = (dp[3] + dp[2]) % MOD;
}
}
cout << dp[3] << "\n";
}
int main(){
int T = 1;
cin >> T;
while(T--){
solve();
}
return 0;
}
------------------------ 分割线 ------------------------
G. 2^Sort
\(\hspace{20px}\)给定一个长度为 \(n\) 的数组 \(a\) 和一个整数 \(k\) ,求索引 \(1 \leq i \leq n - k\) 的个数,使得长度为 \(k+1\) 的子数组 \([a_i, \dots, a_{i+k}]\) 具有以下性质:
- 如果将第一个元素乘以 \(2^0\) ,第二个元素乘以 \(2^1\) ,...,第 \(k+1\) 个元素乘以 \(2^k\) ,那么这个子数组将严格按照递增顺序排序。
\(\hspace{20px}\)更具体地说,计算有多少个索引 \(1 \leq i \leq n - k\) 使得:
\[2^0 \cdot a_i < 2^1 \cdot a_{i+1} < 2^2 \cdot a_{i+2} < \dots < 2^k \cdot a_{i+k} \]
记录一个长度为 \(n-1\) 的数组 \(p\),如果 \(a_i < 2 \cdot a_{i + 1}\),那么 \(p[i] = 1\) ,否则为 \(0\),题目转变成求 \(p\) 数组中长度为 \(k\) 且和为 \(k\) 的子数组个数。
点击查看代码
#include<bits/stdc++.h>
using namespace std;
void solve(){
int n, k;
cin >> n >> k;
vector<int> a(n + 1), p(n, 0);
for(int i = 1;i <= n;i++){
cin >> a[i];
}
for(int i = 1;i < n;i++){
if(a[i] < 2 * a[i + 1]){
p[i] = 1;
}
}
int sum = 0, ans = 0;
for(int i = 1;i <= k;i++){
sum += p[i];
}
if(sum == k) ans++;
for(int i = k + 1;i < n;i++){
sum += p[i];
sum -= p[i - k];
if(sum == k) ans++;
}
cout << ans << "\n";
}
int main(){
int T = 1;
cin >> T;
while(T--){
solve();
}
return 0;
}
浙公网安备 33010602011771号