Codeforces 1733D 891C Envy+1681F Unique Occurrences(可撤销并查集)

891C Envy

题意

        给定一张图以及q个查询,输出每个查询中的边是否全部会出现在某个最小生成树里。

思路

        

首先如果只考虑一次查询,这一次查询只有一条边,那么只要用kruskal算法处理完所有边权小于这条边的边,此时如果这条边的两点已经在同一个连通块里了,那么这条边不可能在MST里,反之则一定可以在某一个MST里。

对于多次查询,每次查询多条边来说类似,先存下所有的询问,然后按照边从小到大开始遍历,如果一组询问中有一条边不符合,那么这个询问就是NO的。

用可撤销并查集来维护每次询问每种边权增加后还原的操作。

代码

#include <bits/stdc++.h>using namespace std;
#define int unsigned long long
const int N = 5e5 + 100;
const int mod = 1000000007;
const int INF = 0x3f3f3f3f;int n, m;
struct node {int u, v, w;
} a[N];int fa[N], sz[N];
vector<pair<int &, int>> his_sz, his_fa;
map<int, vector<int>> mp[N];
vector<int> ve[N];
int ans[N];int find(int x) {while (x != fa[x])x = fa[x];return fa[x];
}void union_set(int x, int y) {x = find(x);y = find(y);if (x != y) {if (sz[x] < sz[y])swap(x, y);his_sz.emplace_back(sz[x], sz[x]);sz[x] += sz[y];his_fa.emplace_back(fa[y], fa[y]);fa[y] = x;}
}int history() {return his_fa.size();
}void roll(int h) {while (his_fa.size() > h) {his_fa.back().first = his_fa.back().second;his_fa.pop_back();his_sz.back().first = his_sz.back().second;his_sz.pop_back();}
}void solve() {cin >> n >> m;for (int i = 1; i <= m; i++) {int u, v, w;cin >> u >> v >> w;a[i].u=u;a[i].v=v;a[i].w=w;ve[w].push_back(i);}for(int i=1;i<=n;i++){fa[i]=i;sz[i]=1;}int q;cin >> q;for (int j = 1; j <= q; j++) {int k;cin >> k;for (int i = 1; i <= k; i++) {int idx;cin >> idx;mp[a[idx].w][j].push_back(idx);}}for (int w = 1; w <= 500010; w++) {if (ve[w].empty())continue;for (auto x: mp[w]) {if (ans[x.first] == 1)continue;int h = history();for (int y: x.second) {if (find(a[y].u) == find(a[y].v))ans[x.first] = 1;union_set(a[y].u, a[y].v);}roll(h);}for (auto x: ve[w]) {union_set(a[x].u, a[x].v);}}for (int i = 1; i <= q; i++) {if(ans[i]==1)cout<<"NO"<<'\n';else cout<<"YES"<<'\n';}
}signed main() {ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);int t = 1;
//	cin>>t;while (t--) solve();return 0;
}

Unique Occurrences

题意

给定一课带边权的树,对于一条从u到v的简单路径, f(u,v) 表示路径上只出现一次的边权的数量,输出所有 f(u,v) 的和。

思路

对于所有边权为 w 的边,它们对于答案的贡献就是只经过一次边权为 w 的路径的数量。因此可以把树中所有边权为 w 的边删除,剩余了一些连通块,这些连通块内没有边权为 w 的边,连通块之间原本是有一条边权为 w 的边,这样就比较容易计算了, w 对于答案的贡献就是所有连通块的大小两两相乘的和。

实现用简单的分治完成

代码

#include <bits/stdc++.h>using namespace std;
#define int unsigned long long
const int N = 5e5 + 100;
const int mod = 1000000007;
const int INF = 0x3f3f3f3f;vector<pair<int,int>>to[N];int fa[N], sz[N];
vector<pair<int &, int>> his_sz, his_fa;int find(int x) {while (x != fa[x])x = fa[x];return fa[x];
}void union_set(int x, int y) {x = find(x);y = find(y);if (x != y) {if (sz[x] < sz[y])swap(x, y);his_sz.emplace_back(sz[x], sz[x]);sz[x] += sz[y];his_fa.emplace_back(fa[y], fa[y]);fa[y] = x;}
}int history() {return his_fa.size();
}void roll(int h) {while (his_fa.size() > h) {his_fa.back().first = his_fa.back().second;his_fa.pop_back();his_sz.back().first = his_sz.back().second;his_sz.pop_back();}
}int dfs(int l,int r){if(l==r){int res=0;for(auto p:to[l]){res+=sz[find(p.first)]*sz[find(p.second)];}return res;}int res=0;int mid=(l+r)/2;int h=history();for(int i=l;i<=mid;i++){for(auto p:to[i]){union_set(p.first,p.second);}}res+=dfs(mid+1,r);roll(h);h=history();for(int i=mid+1;i<=r;i++){for(auto p:to[i]){union_set(p.first,p.second);}}res+=dfs(l,mid);roll(h);return res;
}void solve(){int n;cin>>n;for(int i=1;i<=n;i++){fa[i]=i;sz[i]=1;if(i==n)continue;int u,v,w;cin>>u>>v>>w;to[w].emplace_back(u,v);}cout<<dfs(1,n);
}signed main() {ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);int t = 1;
//	cin>>t;while (t--) solve();return 0;
}

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

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

相关文章

Math Reference Notes: 数学思想和方法

文章目录 1. 数学思想1.1 数形结合思想1.2 转化思想1.3 分类讨论思想1.4 整体思想 2. 数学方法2.1 配方法2.2 因式分解法2.3 待定系数法2.4 换元法2.5 构造法2.6 等积法2.7 反证法2.8 判别式法 1. 数学思想 1.1 数形结合思想 定义&#xff1a;将数与形&#xff08;代数与几何…

linux 安装使用php环境, 以及常用操作介绍

php的源码编译安装,属实是太麻烦太痛苦了&#xff1b;于是我们选择放弃这种方式&#xff0c;采用linux自带的包管理器来安装。 本文使用的linux发行版本是centOs, 安装php环境的指令如下 yum install php php-fpm 如果你的YUM仓库中没有你需要的版本&#xff0c;你可能需要添…

《数据结构》--顺序表

C语言语法基础到数据结构与算法&#xff0c;前面已经掌握并具备了扎实的C语言基础&#xff0c;为什么要学习数据结构课程&#xff1f;--我们学完本章就可以实践一个&#xff1a;通讯录项目 简单了解过后&#xff0c;通讯录具备增加、删除、修改、查找联系人等操作。要想实现通…

Python学习笔记—100页Opencv详细讲解教程

目录 1 创建和显示窗口... - 4 - 2 加载显示图片... - 6 - 3 保存图片... - 7 - 4 视频采集... - 8 - 5视频录制... - 11 - 6 控制鼠标... - 12 - 7 TrackBar 控件... - 14 - 8.RGB和BGR颜色空间... - 16 - 9.HSV和HSL和YUV.. - 17 - 10 颜色空间的转化... - 18 - …

数据结构——栈的实现(java实现)与相应的oj题

文章目录 一 栈栈的概念:栈的实现&#xff1a;栈的数组实现默认构造方法压栈获取栈元素的个数出栈获取栈顶元素判断当前栈是否为空 java提供的Stack类Stack实现的接口&#xff1a; LinkedList也可以当Stack使用虚拟机栈&#xff0c;栈帧&#xff0c;栈的三个概念 二 栈的一些算…

JetBrains IDE 使用git进行多人合作开发教程

以下DEMO可以用于多人共同开发维护一个项目时&#xff0c;使用Git远程仓库的实践方案 分支管理 dev&#xff1a;开发分支test&#xff1a;测试分支prod&#xff1a;生成分支 个人开发也最起码有一个masterdev&#xff0c;作为主分支和当前开发分支。master永远是稳定版本&am…

花几千上万学习Java,真没必要!(十九)

1、StringBuilder&#xff1a; 测试代码1&#xff1a; package stringbuilder.com; import java.util.ArrayList; import java.util.List; public class StringBuilderExample { public static void main(String[] args) { // 初始化StringBuilder StringBuilder sb n…

腾讯会议产品策划的成长之路:从万字文档到功能落地的实战经验

腾讯会议产品策划的成长之路&#xff1a;从万字文档到功能落地的实战经验 在腾讯会议的产品团队中&#xff0c;有这样一位产品策划&#xff0c;他以其出色的逻辑思维、全局观念以及扎实的执行力&#xff0c;在团队中发挥着举足轻重的作用。他就是林陪同&#xff0c;一个自称“会…

css font 优化

文章目录 使用 font-display 控制字体加载预加载关键字体选择合适的字体文件类型按需创建字体文件HTTP 缓存优化 使用 font-display 控制字体加载 避免字体加载导致的空白 block&#xff1a;浏览器在短暂的阻塞期内不显示任何文本&#xff0c;直到字体加载完成。这可能导致页…

JAVA进阶学习12

文章目录 一、File类1.1 File对象的构造1.2 File对象的常见方法判断功能的方法获取功能的方法绝对路径和相对路径创建删除功能的方法 1.3 File的常用遍历方法1.4 File获取并遍历的其他方法1.5 用法举例二、IO流2.1 IO的分类2.2 字节流的方法概述2.2.1 FileOutputStream2.2.2 Fi…

如何配置Memcached以减少对数据库的直接访问

如何配置Memcached以减少对数据库的直接访问 1. 引言 在现代应用程序中&#xff0c;数据库通常是性能瓶颈的主要来源之一。通过使用Memcached&#xff0c;开发者可以显著减少数据库的负载&#xff0c;提高应用程序的响应速度。本文将详细介绍如何配置Memcached&#xff0c;以…

UE4-字体导入

一.字体导入 方法一&#xff1a; 然后通过导入将自己想要的字体导入到项目中&#xff0c;也可以直接将我们放在桌面的字体直接拖入到我们的内容浏览器中。 但是要注意想要发售游戏的话不可以这样导入微软的字体&#xff0c;因为Windows自带基本都有版权&#xff0c;所以最…

odoo17创建一个默认UI视图

XML 数据文件 当要加载的数据具有简单格式时&#xff0c;CSV 格式很方便。当格式更复杂时&#xff08;例如&#xff0c;加载视图或电子邮件模板的结构&#xff09;&#xff0c;我们使用 XML 格式。例如&#xff0c;此帮助字段包含 HTML 标记。虽然可以通过 CSV 文件加载此类…

明星应援系统小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;线上应援管理&#xff0c;线下应援管理&#xff0c;应援物品管理&#xff0c;购买订单管理&#xff0c;集资应援管理&#xff0c;集资订单管理&#xff0c;市集订单管理&#xff0…

极致竞争思维

老板请了几个毕业生&#xff0c;培训了一年&#xff0c;他们现在对业务的熟悉程度比我都熟悉多了&#xff0c;只是基本功不扎实&#xff0c;做出来的东西有很多问题。 老板请我来&#xff0c;给了我一个硬件总监的位置&#xff0c;实际上是要对他的整个系统做出诊断。 也是难为…

【QT】线程控制和同步

目录 概述 QThread常用API 线程使用 创建一个QThread的子类 主线程启动线程 线程安全 互斥锁 QMutex 使用示例&#xff1a;两个线程一个共享静态变量进行 线程子类创建 主线程调用 QMutexLocker 条件变量 信号量 概述 在 Qt 中&#xff0c;多线程的处理⼀般是…

【CSS in Depth 2 精译_020】3.3 元素的高度

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 第一章 层叠、优先级与继承&#xff08;已完结&#xff09; 1.1 层叠1.2 继承1.3 特殊值1.4 简写属性1.5 CSS 渐进式增强技术1.6 本章小结 第二章 相对单位&#xff08;已完结&#xff09; 2.1 相对…

【proteus经典实战】定时器控制交通灯指示灯

一、简介 基于8051系列单片机实现&#xff0c;旨在模拟一个简单的交通灯系统&#xff0c;实现红、黄、绿灯的交替亮灭。使用了特殊功能寄存器&#xff08;SFR&#xff09;和位操作来控制硬件&#xff0c;使用定时器0的中断功能来控制交通灯信号的切换。通过软件控制&#xff0…

解决selenium打印保存为PDF时图片未加载成功的问题

使用selenium打印网页时&#xff0c;如果程序运行很快的话&#xff0c;可能会导致图片没有加载成功即进行了保存&#xff0c;出现这个问题最初的思考是在执行打印任务时使用js进行强制等待&#xff0c;后发现实现效果并不好。在加载页面时使用自动下滑的方式将网页拉到底&#…

uniapp动态计算并设置元素高度

<template><view><scroll-view id"sv-box" :scroll-y"true" :style"{height:navHeightpx}"></scroll-view><view id"btn-box"><button>取消</button><button>确认</button><…