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

ABC 352

目录

        D. Permutation Subsequence

        E. Clique Connect 


 

 

 

D. Permutation Subsequence

        题中两个特征提示了是滑动窗口:(1)固定 k 个数(2)这 k 个数是连续的

        因此只需要遍历 1 到 n,固定窗口大小为 k,下标就是数,而下标对应的值是这个数字在 p 数组中出现的下标,通过单调队列维护区间内的最大值和最小值。

        单调队列里存的永远是下标,在遍历哪个数组存的就是那个数组的下标(也就是 i)。注意 h = 1,t = 0,看有没有元素是看 h <= t。

        因为窗口长度是固定的,所以队列中的下标差值最大值就是固定的,判是否有元素过期(已经从窗口左端出去了),是看 q [ t ] 与 q [ h ] 的差是否超出窗口大小,而不是看队列里的数量是否超出窗口大小。其中 q [ t ] 就是 i。

        注意要在 i >= k 的时候才能更新答案。

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 2e5 + 5, INF = 1e18;int T, n, k, cnt, ans, a[N], pos[N], q1[N], q2[N];	// min max
string s;signed main()
{cin >> n >> k;for (int i = 1; i <= n; i ++){cin >> a[i];pos[a[i]] = i;}int h1 = 1, t1 = 0, h2 = 1, t2 = 0;ans = INF;for (int i = 1; i <= n; i ++){while (h1 <= t1 && pos[q1[t1]] > pos[i])t1 --;q1[++ t1] = i;if (q1[h1] < i - k + 1)h1 ++;while (h2 <= t2 && pos[q2[t2]] < pos[i])t2 --;q2[++ t2] = i;if (q2[h2] < i - k + 1)h2 ++;if (i >= k)ans = min(ans, pos[q2[h2]] - pos[q1[h1]]);}cout << ans;return 0;
}

 

 

 

 

 

E. Clique Connect 

 

        和 ks 几乎完全一样,只不过没有直接给出所有要加的边。

        先按照边权值从小到大排序,从小的开始,每个集合选第一个作为代表,遍历剩下的,如果不在一个集合就合并,一旦加满 n - 1 条边就退出。 

        能否建成一棵树是看能不能选出来 n - 1 条边,因为 ks 是对边进行操作,不是看能不能选出来 n 个点。

 

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 2e5 + 5, INF = 1e18;struct node
{int k, c, id;bool operator < (const node & other) const{if (c != other.c)return c < other.c;return k < other.k;}
}p[N];int T, n, m, cnt, ans, fa[N];
vector<int> a[N];int find(int x)
{if (x == fa[x])return x;return fa[x] = find(fa[x]);
}signed main()
{cin >> n >> m;for (int i = 1; i <= m; i ++){cin >> p[i].k >> p[i].c;p[i].id = i;for (int j = 1; j <= p[i].k; j ++){int x;cin >> x;a[i].push_back(x);}}for (int i = 1; i <= n; i ++)fa[i] = i;sort(p + 1, p + m + 1);for (int i = 1; i <= m; i ++){int k = p[i].k, c = p[i].c, id = p[i].id;int u = a[id][0];u = find(u);for (int j = 1; j < a[id].size(); j ++){int v = a[id][j];v = find(v);if (u != v){fa[v] = u;cnt ++;ans += c;}}if (cnt == n - 1)break;}if (cnt != n - 1)cout << "-1";elsecout << ans;return 0;
}
http://www.xdnf.cn/news/677845.html

相关文章:

  • 依赖倒置原则 (Dependency Inversion Principle, DIP)
  • 分块查找详解
  • 第二章 1.3 数据采集风险的现有技术和解决方案
  • RK3568 OH5.1 镜像烧录
  • python第34天打卡
  • 深耕数字化赛道,联众优车以创新风控体系构筑汽车金融护城河
  • Fine-tuning:微调技术,训练方式,LLaMA-Factory,ms-swift
  • AI智能分析网关V4垃圾桶满溢检测算法打造城市/公园/街道等场景应用方案
  • 浅谈Mysql的MVCC机制(RC与RR隔离级别)
  • LeetCode 1696. 跳跃游戏 VI(中等)
  • AI Agent开发第75课-数据、张量、流水线并行全解析
  • 【Web应用】若依:基础篇03-入门案例,若依代码生成器生成前后端代码
  • Web通信协议全景解析:从HTTP到WebService的技术演进与对比
  • 如何寻找大模型在企业业务中的价值?
  • Anaconda下载安装+配置虚拟环境保姆级教程(2025版)
  • 实时数仓flick+clickhouse启动命令
  • 第一个ASP.NET项目
  • 【Elasticsearch】retry_on_conflict
  • Python中while 1和while True有何区别?深入解析无限循环的写法选择
  • 百胜咨询公司:企业EcoVadis认证的专业导航者
  • SIGGRAPH 2025 | 快手可灵团队提出3D感知的电影级文本到视频生成框架CineMaster
  • 鸿蒙5开发宝藏案例分享---一多断点开发实践
  • 0527漏洞原理:SQL注入笔记 SQL注入类型(联合查询注入、报错注入实操)
  • 【本地部署】 Deepseek+Dify创建工作流
  • 【Vue 3 运行时 Diff 算法深度解析:五步走策略实现高效更新】
  • MySQL数据库第一章
  • 科技趋势分析系统 BBC (Big Bang of Computing)
  • mysql中的索引怎么用?
  • [特殊字符]《计算机组成原理》第 8 章 - CPU 的结构和功能
  • 本地部署 DeepSeek