当前位置: 首页 > news >正文

Codeforces Round 1019 (Div. 2) A-D

A. Common Multiple

在这里插入图片描述
在这里插入图片描述

题目大意

给你一个长度为n的数组a,让你求a的最长子数组,假设长度为m,使得对于每个元素aia_iai,都存在有另一个同样长度m的数组b,数组b的每个元素都不相同,其对应位置的bib_ibiai∗bi=aj∗bj(1<=i<j<m)a_i*b_i=a_j*b_j(1<=i<j<m)aibi=ajbj(1<=i<j<m)

思路

对于一个元素aia_iai,若要满足条件,应该使得ai∗bi=a数组的最小公倍数a_i*b_i=a数组的最小公倍数aibi=a数组的最小公倍数,那么最长子数组应该是a中不同元素的个数,若有相同元素,则不满足b数组中每个元素都不相同的条件

// Author: zengyz
// 2025-07-14 09:45#include <bits/stdc++.h>using namespace std;
typedef long long ll;void solve()
{int n;cin >> n;vector<int> a(n);set<int> s;for (auto &x : a)cin >> x, s.insert(x);cout << s.size() << endl;return;
}int main()
{ios::sync_with_stdio(0);cin.tie(0), cout.tie(0);int _T = 1;cin >> _T;while (_T--){solve();}return 0;
}

B. Binary Typewriter

在这里插入图片描述
在这里插入图片描述

题目大意

给你一个01串,你有一个打字机,上面有两个按键0和1 ,现在你的手指放在0上,你可以进行如下操作:
按下当前手指放在的按键上,并打出一个对应按键的自负
将手指移到另一个按键上

你可以进行最多一次操作,使得其中的一个子串进行翻转
问打出对应01串的最小的操作次数是多少

思路

首先至少需要n次操作才能打出长度为n的串,然后我们考虑将手指移动的操作,可以把连续的0和1进行压缩,例如110011我们只需要分析101的情况,我们设压缩后的数组为v,
如果数组v大小为1,那么答案就是n+(第一个字符是不是1)
如果数组大小为2或3,那么一定会操作一次移动手指,可以通过反转将0放到前面,1放到后面,那么操作次数就是n+1
如果数组大小大于3 ,那么就会出现0 1 0 1或者1 0 1 0的情况,我们可以通过翻转他们得到连续的1和0 例如0 0 1 1或1 0 0 1,就可以减少两次翻转操作 那么答案就是n+(第一个字符是不是1)+(v数组大小-1[需要翻转的次数])-2

// Author: zengyz
// 2025-07-14 09:58#include <bits/stdc++.h>using namespace std;
typedef long long ll;void solve()
{int n;cin >> n;string s;cin >> s;int last = -1;vector<int> v;for (int i = 0; i < n; i++){int tmp = s[i] - '0';if (last != tmp){last = tmp;v.push_back(tmp);}}
if(v.size()==1)
{cout<<n+(s[0]=='1')<<endl;
}
else  if(v.size()<=3)
{cout<<n+1<<endl;
}
else 
{int ans=(s[0]=='1');cout<<ans+n+v.size()-1-2<<endl;
}return;
}int main()
{ios::sync_with_stdio(0);cin.tie(0), cout.tie(0);int _T = 1;cin >> _T;while (_T--){solve();}return 0;
}

C. Median Splits

在这里插入图片描述
在这里插入图片描述

题目大意

给你一个长度为n的数组和k
分能否通过将数组分为连续的三段,使得三段的中位数的中位数小于等于k

思路

统计前缀和后缀中存在一段的中位数小于等于k的情况,如果前缀之后或者后缀之前还能塞一个大于k的元素,我们也给他放进去,如果是<=k的我们留给之后的两段一定是最优的
然后我们考虑前缀存在的情况,那么我们通过遍历后续的两段长度,通过统计数组中小于等于k的元素个数和数组长度的情况可以得出是否存在满足小于等于k的情况,如果还存在一段这样的数组,那么有两段数组小于等于k,满足题意
后缀同理

// Author: zengyz
// 2025-07-14 10:40#include <bits/stdc++.h>using namespace std;
typedef long long ll;void solve()
{int n, k;cin >> n >> k;vector<int> b(n + 1), pre(n + 2), suf(n + 2);for (int i = 1; i <= n; i++)cin >> b[i];for (int i = 1; i <= n; i++)pre[i] = pre[i - 1] + (b[i] <= k ? 1 : 0);for (int i = n; i >= 1; i--)suf[i] = suf[i + 1] + (b[i] <= k ? 1 : 0);int idx1 = 0, idx2 = 0;for (int i = 1; i <= n; i++){if (!idx1)if (pre[i] >= (i - 1) / 2 + 1)idx1 = i;}for (int i = n; i >= 1; i--){int j = n - i + 1;if (!idx2)if (suf[i] >= (j - 1) / 2 + 1)idx2 = i;}if (idx1 % 2 == 1 && b[idx1 + 1] > k && n - idx1 > 2)idx1++;if ((n - idx2 + 1) % 2 && b[idx2 - 1] > k && idx2 > 3)idx2--;// cout << idx1 << " " << idx2 << endl;if (idx1){for (int i = idx1 + 1; i < n; i++){int res1 = i - idx1;int res2 = n - i;if (pre[i] - pre[idx1] >= (res1 - 1) / 2 + 1 || pre[n] - pre[i] >= (res2 - 1) / 2 + 1){cout << "YES" << endl;return;}}}if (idx2){for (int i = idx2 - 1; i > 1; i--){int res1 = idx2 - i;int res2 = i - 1;if (suf[i] - suf[idx2] >= (res1 - 1) / 2 + 1 || suf[1] - suf[i] >= (res2 - 1) / 2 + 1){// cout << suf[1] << " " << suf[i] << " " << suf[idx2] << " " << res1 << " " << res2 << endl;cout << "YES" << endl;return;}}}cout << "NO" << endl;return;
}int main()
{ios::sync_with_stdio(0);cin.tie(0), cout.tie(0);int _T = 1;cin >> _T;while (_T--){solve();}return 0;
}

D. Local Construction

在这里插入图片描述
在这里插入图片描述

题目大意

对于一个数组,定义局部最大值和局部最小值
给你每个元素在第几轮被删除,让你求一个排列满足在
奇数轮删除排列内不是局部最小值的所有元素
偶数轮删除排列内不是局部最大值的所有元素
一定存在解法,让你求出排列

思路

开始容易构造一些不存在解法的排列把自己迷住,其实在当前轮没被删除的数一定是满足他们时当前的局部最小值(最大值)所以他们应该是和当前轮的元素穿插着放的,设最后剩下的元素位置为idx:
对于奇数轮应该删除的元素,在idx左边的我们从大到小放,idx右边的我们从小到大放
对于偶数轮应该删除的元素,在idx左边的我们从小到大放,idx右边的我们从大到小放
那么为什么呢?试想idx,在奇数轮我们要让它作为局部最小值,在偶数轮我们要让它作为局部最大值,那么idx左右两边一定要对称放,同时在奇数轮左边从大到小以及右边从小到大我们才能保证边缘不会出现局部最小值的情况,偶数轮同理!
如此构造一定能满足答案:

// Author: zengyz
// 2025-07-14 13:58#include <bits/stdc++.h>using namespace std;
typedef long long ll;void solve()
{int n;cin >> n;vector<int> a(n+1), f(n+1);vector<vector<int>> b(n+1);int idx = -1;int maxx=0;for (int i = 1; i <= n; i++){cin >> a[i];maxx=max(a[i],maxx);if (a[i] == -1){idx = i;continue;}b[a[i]].push_back(i);}int now = 1;int tmp = 1;int count = 1;int l=1,r=n;while (maxx--){now ^= 1;if (now == 0){for (int i = 1; i<idx; i++){if ( a[i] == count)f[i] = r--;}for (int i = n; i >idx; i--){if ( a[i] == count)f[i] = r--;}}else{for (int i = 1; i < idx; i++){if (a[i] == count)f[i] = l++;}for (int i = n; i>idx; i--){if ( a[i] == count)f[i] =l++;}}count++;}f[idx]=l;for(int i=1;i<=n;i++)cout<<f[i]<<" ";cout<<endl;return;
}int main()
{ios::sync_with_stdio(0);cin.tie(0), cout.tie(0);int _T = 1;cin >> _T;while (_T--){solve();}return 0;
}
http://www.dtcms.com/a/279062.html

相关文章:

  • Windows下安装nvm管理多个版本的node.js
  • 在项目中集成开源的表单设计器FcDesigner源码
  • 「源力觉醒 创作者计划」_文心开源模型(ERNIE-4.5-VL-28B-A3B-PT)使用心得
  • linux系统下Ollama 模型下载出现 “no space left on device” 错误(非Docker)怎么删缓存/没下完的模型?
  • Docker入门基础
  • Vue+axios
  • Cadence操作说明
  • STM32固件升级设计——SD卡升级固件
  • 论文阅读:WildGS-SLAM:Monocular Gaussian Splatting SLAM in Dynamic Environments
  • 如何在 React + TypeScript 中实现 JSON 格式化功能
  • 【React Natve】NetworkError 和 TouchableOpacity 组件
  • MySQL的可重复读隔离级别实现原理分析
  • 银河麒麟KYSEC安全机制详解
  • 在echarts中legend中设置rich中第二项的宽度不起作用的处理方案。
  • PyTorch张量(Tensor)创建的方式汇总详解和代码示例
  • 鸿蒙Next开发,配置Navigation的Route
  • 26-计组-多处理器
  • HCIA认证核心知识体系全解析
  • OpenCV计算机视觉实战(15)——霍夫变换详解
  • Mars3d的走廊只能在一个平面的无法折叠的解决方案
  • UNet 改进(36):引入ELAN-FR模块(通道注意力+空间注意力)
  • 华为OD 消消乐游戏
  • 机器学习/深度学习训练day1
  • 第十五节:Vben Admin 最新 v5.0 (vben5) + Python Flask 快速入门 - vue前端 生产部署
  • Java 中的类加载机制:从 Class 文件到内存中的类
  • 11、鸿蒙Harmony Next开发:列表布局 (List)
  • Mysql用户管理及在windows下安装Mysql5.7(压缩包方式)远程连接云服务器(linux)上的Mysql数据库
  • spring bean初始化异步执行
  • Java字符串、时间、数字知识点
  • dify 原生mcp应用案例