• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 众包
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

yumiym765

  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

2025/09/04 练习

C. Beautiful Sequence

2069C

题意:找到 \([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

1692G

\(\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;
}

posted on 2025-09-05 15:51  羊毛corn  阅读(12)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3