【离线/并查集】CF1213 G

想起来好久没写题解了,随便写一下把

感觉写多了div3后面的题就变得简单了,div3似乎没什么思维含量,甚至有时候能开出div3的2100....

 心血来潮写一下这个*1800的题解,思路一下就出了,但是一开始多了个log被卡了,提醒一下自己

Problem - G - Codeforces

题意:

 

思路:

首先做法肯定要给询问排序,那就相当于离线

离线的写法还是有讲究的,最好是把答案全部求出来再去O(1)查询,不然容易被卡

排序之后枚举边的权值,就是把边一条条加上去,相当于Kruskal的过程了

问题是点对的贡献怎么算,很显然可以拆,对于一个连通块,贡献为sz * (sz - 1)

那么对于每个询问是不是都要考虑遍历所有连通块,但是这样是O(nq)的

这个也是套路了,考虑询问之间的变化量,其实就是数据结构多一格的思想

如果加边之后两个连通块变成一个了,贡献的变化量是什么呢,这个可以手推

之前是 x * (x - 1) / 2,y * (y - 1) / 2

之后是 (x + y) * (x + y - 1) / 2

减一减就是 x * y

那么在合并之后贡献 += x * y即可

一开始我写成这样

#include <bits/stdc++.h>#define int long longconstexpr int N = 2e5 + 10;
constexpr int M = 2e5 + 10;
constexpr int mod = 1e9 + 7;
constexpr int Inf = 0x3f3f3f3f;std::pair<int, int> q[N];
std::vector<std::array<int, 2> > E[N];int n, m;
int b[N];
int f[N], sz[N];int find(int x) {return f[x] = (x == f[x]) ? x : find(f[x]);
}
void join(int u, int v) {int f1 = find(u), f2 = find(v);if (sz[f1] > sz[f2]) std::swap(f1, f2);if (f1 != f2) {f[f1] = f2;sz[f2] += sz[f1];}
}
void solve() {std::cin >> n >> m;for (int i = 1; i <= n; i ++) {f[i] = i;sz[i] = 1;}for (int i = 1; i <= n - 1; i ++) {int u, v, w;std::cin >> u >> v >> w;E[w].push_back({u, v});}for (int i = 1; i <= m; i ++) {std::cin >> q[i].first;q[i].second = i;}std::sort(q + 1, q + 1 + m);int ans = 0;for (int i = 1; i <= m; i ++) {int w = q[i].first;for (auto [u, v] : E[w]) {int f1 = find(u), f2 = find(v);if (f1 != f2) {ans += sz[f1] * sz[f2];}join(u, v);}b[q[i].second] = ans;}for (int i = 1; i <= m; i ++) {std::cout << b[i] << " \n" [i == m];}
}
signed main() {std::ios::sync_with_stdio(false);std::cin.tie(nullptr);int t = 1;while(t --) {solve();}return 0;
}

这样子 T7了,但是枚举权值就没问题,不知道为什么这样会快,可能是STL的问题....

以后离线就写成把所有答案都求出来再去O(1)查询的形式会好一点,不容易被卡....

#include <bits/stdc++.h>#define int long longconstexpr int N = 2e5 + 10;
constexpr int M = 2e5 + 10;
constexpr int mod = 1e9 + 7;
constexpr int Inf = 0x3f3f3f3f;std::vector<std::array<int, 2> > E[N];int n, m;
int b[N];
int f[N], sz[N];int find(int x) {return f[x] = (x == f[x]) ? x : find(f[x]);
}
void join(int u, int v) {int f1 = find(u), f2 = find(v);if (sz[f1] > sz[f2]) std::swap(f1, f2);if (f1 != f2) {f[f1] = f2;sz[f2] += sz[f1];}
}
void solve() {std::cin >> n >> m;for (int i = 1; i <= n; i ++) {f[i] = i;sz[i] = 1;}for (int i = 1; i <= n - 1; i ++) {int u, v, w;std::cin >> u >> v >> w;E[w].push_back({u, v});}int ans = 0;for (int w = 1; w <= 2e5; w ++) {for (auto [u, v] : E[w]) {int f1 = find(u), f2 = find(v);if (f1 != f2) {ans += sz[f1] * sz[f2];}join(u, v);}b[w] = ans;}int q = 1;for (int i = 1; i <= m; i ++) {std::cin >> q;std::cout << b[q] << " \n" [i == m];}
}
signed main() {std::ios::sync_with_stdio(false);std::cin.tie(nullptr);int t = 1;while(t --) {solve();}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/111525.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

工程化模式-进阶

幼年期&#xff1a;无模块化 成长期&#xff1a; IIFE是立即执行函数表 IIFE其实也就是匿名函数&#xff0c;归根结底都是函数 一种是申明式&#xff0c;一种是表达式。但是两种其实存在着不同&#xff0c;其中第二种中存在着变量提升 function fn1() var fn function ()v…

使用stream流根据对象属性对复杂list对象去重

日常开发中&#xff0c;我们可能会遇到这样一种情况&#xff0c;需要对数据库查询出来的数据进行一个二次处理&#xff0c;从而达到我们需要的数据结构。stream流正是java8提供的对复杂list操作方便工具。 我们先介绍如何使用stream流根据对象属性对复杂list对象去重&#xff0…

1最新动态

已经入驻面包多了 地址&#xff1a;https://mbd.pub/o/author-a26am2hoZQ/work

【R】数据相关性的可视化

一千零一技|相关性分析及其可视化&#xff1a;copy&paste&#xff0c;搞定 .libPaths(c("/bioinfo/home/software/miniconda3/envs/R4.0/lib/R/library")) #data("mtcars") library("PerformanceAnalytics") # pdf("test.pdf") #…

惊艳!这些独特的搜索引擎你都知道吗?

随着互联网的普及和发展&#xff0c;搜索引擎已经成为我们日常获取信息的重要工具。然而&#xff0c;当我们想要寻找一些特定类型的信息时&#xff0c;普通的搜索引擎可能无法满足我们的需求。这时&#xff0c;一些特殊的搜索引擎便能派上用场本。 文将介绍几种常用的特殊搜索引…

EDID详解

文章目录 字节含义一些概念YCC位 文章目录 字节含义一些概念YCC位 字节含义 EDID通常由128个字节组成&#xff0c;这些字节提供了关于显示器的各种详细信息。以下是EDID中每个字节位表示的一般含义&#xff1a; Header&#xff08;头部&#xff09;: 字节0: Header&#xff…

全面预算管理软件

目前主流产品厂商是&#xff1a;Oracle&#xff08;产品hyperion海波龙&#xff09;&#xff0c;SAP&#xff08;BPC&#xff09;&#xff0c;IBM&#xff08;TM1&#xff09;Tagetik从意大利引入中国&#xff0c;元年做全面预算管理软件20年左右&#xff0c;元年C1全面预算管理…

前端开发规范总结

1、 前言 前端开发中&#xff0c;不同的开发者有不同的代码编写习惯&#xff0c;但实际项目中有的公司是需要协同开发的&#xff0c;想要高效的协同&#xff0c;规定一个大家都能接受的规范就尤为重要。 坚持好的代码风格规范&#xff0c;从你我做起。 2、代码规范的好处 …

hue实现对hiveserver2 的负载均衡

如果你使用的是CDH集群那就很是方便的 在Cloudera Manager中&#xff0c;进入HDFS Service 进入Instances标签页面&#xff0c;点击Add Role Instances按钮&#xff0c;如下图所示 点击Continue按钮&#xff0c;如下图所示 返回Instances页面&#xff0c;选择HttpFS角色…

【MyBatis】mvc模式以及Mapper文件中的namespace以及ORM思想

目录 什么是MVC三层架构&#xff0c;初步了解&#xff1f; namespace的作用是什么&#xff1f; Mapper文件中的namespace&#xff1f; ORM思想&#xff08;对象关系映射思想&#xff09; 其中提供了一套映射规则和API 什么是MVC三层架构&#xff0c;初步了解&#xff1f; 三…

9.构造器与垃圾收集器 对象的前世今生

9.1 对象与变量的生存空间 栈与堆&#xff1a;生存空间 在Java中&#xff0c;程序员会在乎内存中的两种区域&#xff1a;对象的生存空间堆&#xff08;heap&#xff09;和方法调用及变量的生存空间&#xff08;stack&#xff09;。当Java虚拟机启动时&#xff0c;它会从底层的…

【Netty专题】【网络编程】从OSI、TCP/IP网络模型开始到BIO、NIO(Netty前置知识)

目录 前言前置知识一、计算机网络体系结构二、TCP/IP协议族2.1 简介*2.2 TCP/IP网络传输中的数据2.3 地址和端口号2.4 小总结 三、TCP/UDP特性3.1 TCP特性TCP 3次握手TCP 4次挥手TCP头部结构体 3.2 UDP特性 四、总结 课程内容一、网络通信编程基础知识1.1 什么是Socket1.2 长连…

django REST framework-使用与不使用的区别?

首先&#xff0c;来回顾一下传统的基于模板引擎的 django 开发工作流&#xff1a; 绑定 URL 和视图函数。当用户访问某个 URL 时&#xff0c;调用绑定的视图函数进行处理。 编写视图函数的逻辑。视图中通常涉及数据库的操作。 在视图中渲染 HTML 模板&#xff0c;返回 HTTP 响应…

互联网摸鱼日报(2023-10-20)

互联网摸鱼日报(2023-10-20) 博客园新闻 OPPO让折叠机超越直板旗舰成为可能 特斯拉的“大空头”&#xff0c;是马斯克那张嘴 逃避内卷的年轻人&#xff0c;盯上了老年大学的音乐课 理想市值超蔚来1倍&#xff0c;一场属于增程式的胜利 补足折叠屏影像短板&#xff0c;OPPO…

软件工程与计算总结(十七)软件构造

一.概述 1.定义 软件构造是以编程为主的活动&#xff0c;类似于软件实现。但软件构造又不止编程这么简单&#xff0c;除了核心的编程任务之外&#xff0c;还设计详细设计&#xff08;数据结构与算法设计&#xff09;、单元测试、集成与集成测试以及其他活动~ 2.软件构造是设计…

redis,mq如何解决重复支付问题

重复支付问题可以通过以下方式解决&#xff1a; Redis解决重复支付问题&#xff1a;Redis可以使用它的原子性操作来避免重复支付问题。可以将每个订单的订单号作为一个key存储在Redis中&#xff0c;并设置一个过期时间。当客户付款时&#xff0c;先检查该订单号在Redis中是否存…

【Android】BRVAH多布局实现

前言 基于3.0.4版本的BRVAH框架实现的 实现方法 1.创建多个不同类型的布局&#xff08;步骤忽略&#xff09; 2.创建数据实体类 数据类要实现【MultiItemEntity】接口 class MyMultiItemEntity(//获取布局类型override var itemType: Int,var tractorRes: Int? null,va…

简单谈谈我参加数据分析省赛的感受与体会

数据分析省赛的感受与体会 概要考试前的感受与体会考试注意事项小结 概要 大数据分析省赛指的是在省级范围内举办的大数据分析竞赛活动。该竞赛旨在鼓励和推动大数据分析领域的技术创新和人才培养&#xff0c;促进大数据技术与应用的深度融合&#xff0c;切实解决实际问题。参…

win32-注册表-32位-64位-读写值-Qt-C++

文章目录 1.32访问64位和64位访问32位2.在Qt中qsetting的使用3.总结 1.32访问64位和64位访问32位 32位的应用程序想访问64位的注册表视图的标志是KEY_WOW64_64KEY&#xff0c;该标志的值是0x0100。64位的应用程序想访问32位的注册表视图的标志是KEY_WOW64_32KEY。以上两个标志…

Android中级——MVVM

MVVM MVVM是什么&#xff1f;MVVM实现前提ModelViewModelView MVVM是什么&#xff1f; Model-View-ViewMode架构&#xff0c;可看作MVP改进版&#xff0c;将此前Presenter的逻辑操作交给ViewMode中的Binder去处理 Mode&#xff1a;封装数据存储及相关操作逻辑&#xff0c;与MV…