Codeforces Round 804 (Div. 2)(C - D)

1|0C

C
观察题意, 模拟样例, 首先 0 不能动, 因为相邻的 mex 会改变, 然后 1 也是如此, 所以我们固定了 01, 设两个指针 lr 表示固定的位置, 那么此时在他们两个中间的数可以随便移动, 假设有 x 个空位, 那么如果 2 在里面, 2 的选择则是 x 个, 如果不在, 那么很明显我们不能把 2 放进去, 接着我们固定 12, 现在可用的空位为 rl(i+1), 如果 3 在这个空位里面, 那么同理, 会有 rl1i 随便选择, 这里的 i+1 指的是已经固定了的位置, 依次类推即可

#include <bits/stdc++.h> #define int long long using namespace std; const int N = 1e5 + 10, mod = 1e9 + 7; void solve(){ int n; cin >> n; map<int, int> mp; vector<int> a(n + 1); for(int i = 1; i <= n; i++){ cin >> a[i]; mp[a[i]] = i; } int l = mp[0], r = mp[0], res = 1; for(int i = 1; i < n; i++){ int x = mp[i]; if(x < l) l = x; else if(x > r) r = x; else res = res * (r - l + 1 - i) % mod; } cout << res << '\n'; } signed main(){ std::ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);int t;cin>>t;while(t--)solve(); }

2|0D

D
最优方案题, 我们要考虑贪心或者 dp 或者图论
贪心明显不可以, 因为我们无法保证当前操作不会影响前面的操作, 并且难以维护
考虑dp, 设 dpiaii 位置最多能保留多少个
下面给出一个函数 deletable, 定义如下:

  • 一个区间 [l,r] 若可删除, 则有 deletble[l,r]
  • 区间必须是偶数长度
  • 若区间 [l,r] 内的众数不大于区间长度的一半则可以完全删除

那么 dpi 是由 dpj(0,i1) 转移而来, 需要满足:

dpi=maxj=0i1(Deletable(j+1,r)(ai=ajj=0))(dpj+1)

由于我们的 dpi 表示的是前 i 个, 所以我们 in 是不要了的, 也需要满足 Deletabele[i+1,n], 那么答案就是:

ans=maxi=1nDeletable(i+1,n)dpi

#include <bits/stdc++.h> #define int long long using namespace std; const int N = 1e6 + 10, mod = 1e9 + 7; int cnt = 0; void solve(){ int n; cin >> n; vector<int> a(n + 1); vector<vector<int>> sum(n + 1, a); for(int i = 1; i <= n; i++){ cin >> a[i]; for(int j = 1; j <= n; j++){ sum[i][j] = sum[i - 1][j]; } sum[i][a[i]]++; } vector<int> f(n + 1), g(n + 1); for(int i = 1; i <= n; i++){ for(int j = 1; j <= n; j++){ g[i] = max(g[i], sum[n][j] - sum[i][j]); } } int res = 0; vector<int> dp(n + 1, -1e9); dp[0] = 0; for(int i = 1; i <= n; i++){ int tot = 0; for(int j = i - 1; j >= 0; j--){ int l = j + 1, r = i - 1; tot = max(tot, sum[r][a[l]] - sum[l - 1][a[l]]); if((r - l + 1) % 2 == 0 && tot <= (r - l + 1) / 2 && (j == 0 || a[i] == a[j])){ dp[i] = max(dp[i], dp[j] + 1); } } if((n - i) % 2 == 0 && g[i] <= (n - i) / 2){ res = max(res, dp[i]); } } cout << res << '\n'; } signed main(){ std::ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);int t;cin>>t;while(t--)solve(); }

__EOF__

本文作者Sakurajimamai
本文链接https://www.cnblogs.com/o-Sakurajimamai-o/p/18455093.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   o-Sakurajimamai-o  阅读(11)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
-- --
点击右上角即可分享
微信分享提示