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

区间合并+并查集

前言:写完这个题目的时候没意识到这个和区间合并是等价的,现在看起来确实是一个区间合并的题目
(注意这个多米诺骨牌是可以连续推倒的)


在这里插入图片描述

#include<bits/stdc++.h>
using namespace std;#define int long long
int t;
int n,m;
const int N = (int)2e5+5;
struct node{int h,pos;bool operator<(node b){return pos < b.pos;}
}sto[N];
int fa[N];
int find(int x){if(x==fa[x]) return x;return fa[x] = find(fa[x]);
}
int ans[N];bool cmp(int a,int b){return a>b;
}signed main(){cin >> t;while(t--){cin >> n >> m;for(int i=1;i<=n;i++){cin >> sto[i].h;}for(int i=1;i<=n;i++){cin >> sto[i].pos;}sort(sto+1,sto+1+n);for(int i=1;i<=n;i++) fa[i] = i;int j;for(int i=1;i<=n;i=j){int hi = sto[i].h, posi= sto[i].pos;int en = hi + posi;for(j=i+1;j<=n;j++){int hj = sto[j].h, posj = sto[j].pos;if(en>=posj){  // 如果能够到达 fa[j] = i;//更新我们的长度en = max(en,hj+posj); }else{break;}}}for(int i=1;i<=n;i++) ans[i] = 0;for(int i=1;i<=n;i++){int x = find(i);//cout << " i " << x << endl;ans[x]++;}sort(ans+1,ans+1+n,cmp);int e = 0;//cout << " ans 1 " << ans[1] << endl;for(int i=1;i<=m;i++){e+=ans[i];}cout << e << endl;}return 0;
}

http://www.mrgr.cn/news/7064.html

相关文章:

  • linux增删用户
  • 蓝桥杯编程题讲解
  • linux中对.jar文件的配置文件进行修改
  • 发展数控教育机床提高制造创新能力
  • MS sqlserver备份软件 SQLBackupAndFTP
  • 问答泛单页目录站群通用程序——码山侠
  • 【全网行为管理解决方案】上网行为系统有哪些?
  • [运算放大器系列]四、PT100和热电偶采集电路分析
  • 【从问题中去学习k8s】k8s中的常见面试题(夯实理论基础)(十六)
  • 设计模式反模式及UML图示常见误用案例分析
  • 设计模式—代理模式
  • 【深度学习】LLaMA-Factory 大模型微调工具, 微调GLM-4-9B-Chat-1M ,Docker (4)
  • 使用微软Detours库进行DLL注入
  • CSS背景与边框——WEB开发系列18
  • Go Convey测试框架入门(go convey gomonkey)
  • 免费的AI认证考试
  • 数据结构与算法--交换排序与归并排序
  • 计算机网络之IPv4深度解析
  • 【玩转python】入门篇day19-继承、多态以及单例模式
  • -Wl,-rpath= 编译器链接器指定动态库路径 与 LD_LIBRARY_PATH