CF R872 div.2

1|0C

 首先发现第三种操作要去个重,剩下的 xi 的个数和就是最劣答案,现在思考如何用前两种操作使答案变优。
不难发现可以枚举每一个 xi,再考虑 1(xi1)(xi+1)m 中有多少空位,空位即是总位置数减区间内xi 个数。
空位和操作 1,2min,即为可增加的答案。时间复杂度 O(nlogn),需要排序。
思路还是好想,代码恶心,写了好久。

#include <bits/stdc++.h> using namespace std; const int N = 1e5 + 10; int n, m, a[N]; void solve(){ cin >> n >> m; for(int i = 1; i <= n; i++) scanf("%d", &a[i]); vector<int> b; int left = 0, right = 0; for(int i = 1; i <= n; i++){ if(a[i] == -1) left ++; if(a[i] == -2) right ++; if(a[i] > 0) b.push_back(a[i]); } sort(b.begin(), b.end()); b.erase(unique(b.begin(), b.end()), b.end()); int nn = b.size(); int ans = max(min(left + nn, m), min(right + nn, m)), cnt = 1; for(auto t : b){ int l = t - cnt; int r = m - t - (nn - cnt); ans = max(ans, nn + min(l, left) + min(r, right)); cnt ++; } cout << ans << endl; } int main(){ int T; cin >> T; while(T --) solve(); return 0; }

2|0D


__EOF__

本文作者userName
本文链接https://www.cnblogs.com/P32sx-qq1309267816-tel18081238250/p/17411092.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   P32sx  阅读(17)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示