2024/10/8

news/2024/10/8 23:47:12/文章来源:https://www.cnblogs.com/ddxrS/p/18453289

给定一张图,每个点有一个颜色。每次操作求改一个颜色,然后询问所有不同颜色点对的最短距离。


给出一种 \(O(n\sqrt{n})\) 的做法。

先按照边权从小到大排序,然后将边分块。

对于每一个块,我们只需要快速判断块内是否存在一条边的两点颜色不同即可。

对于一个块可以算出 \(\sum (col_{u_i}-col_{v_i})\times rnd_i\),其中 \(rnd_i\) 是随机赋权的常数。当这个值不为 \(0\) 时就当前块内就存在一条满足条件的边。

每次修改和查询均为 \(O(\sqrt{n})\)

[THUPC2022 初赛] 最小公倍树

我们知道一条边的权值为 \(\frac{uv}{\gcd(u,v)}\)

考虑枚举两个点的公因子 \(k\)。可以发现,对于一个 \(k\),在区间 \([L,R]\) 中的所有满足条件的点 \(dk,(d+1)k,(d+2)k,\dots\),我们直接将它们向 \(dk\) 连边是最优的。

所以总边数是 \(O(n\log n)\) 的,然后跑一边最小生成树即可。

CF1120D Power Tree

我们将叶子节点按照 dfs 序排出来,那么一个节点能够控制的叶子节点必然是一个区间,记为\([l_x,r_x]\)

控制一个点就相当于将一个区间增加。我们来考虑差分,相当于将 \(a_{l_x}\) 加,将 \(a_{r_x+1}\) 减。

所以我们能够修改 \(a_1\)\(a_{n+1}\) 的值。对于每一个区间,我们可以选择连接一条边 \(l_x\to r_x+1\),目标是让所有点都与 \(n+1\) 连通。

跑一边最小生成树即可。注意要记录所有可行的方案。

HNOI2010 城市建设

动态最小生成树。用线段树分治解决。

让我们考虑不在操作区间 \([l,r]\) 中所有边:

  • 将区间 \([l,r]\) 中的边设为 \(inf\),跑一边最小生成树后不在区间 \([l,r]\) 内且不在最小生成树上的边最后一定不会在最小生成树上。

  • 将区间 \([l,r]\) 中的边设为 \(-inf\),跑一边最小生成树后不在区间 \([l,r]\) 内且在最小生成树上的边最后一定会在最小生成树上。

最后分治到 \(l=r\) 时,只需要把剩下的边再跑一边最小生成树就可以求出第 \(l\) 个询问的答案。

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 5e4 + 5, inf = 0x3f3f3f3f3f3f3f3f;
int n, m, q, fa[N], siz[N], flg[N], top;
int u[N], v[N], w[N], val[N], a[N], b[N];
vector<int> vec[N << 2];
int FindSet(int x) {return fa[x] == x ? x : FindSet(fa[x]);}
void insert(int p, int l, int r, int x, int y) {int mid = l + r >> 1;vec[p].push_back(y);if(l == r) return;if(x <= mid) insert(p << 1, l, mid, x, y);else insert(p << 1 | 1, mid + 1, r, x, y);
}
struct node {int x, y;} stk[N];
void del(int p) {while(top > p) fa[stk[top].x] = stk[top].x, siz[stk[top].y] -= siz[stk[top].x], top--;}
void merge(int u, int v) {if(siz[u] > siz[v]) swap(u, v);stk[++top] = node({u, v}), fa[u] = v, siz[v] += siz[u];
}
void solve(int p, int l, int r, int ans, vector<int> g) {int mid = l + r >> 1, now = top;vector<int> vc;if(l == r) {val[a[l]] = w[a[l]] = b[l];sort(g.begin(), g.end(), [](int i, int j) {return val[i] < val[j];});for(auto x : g) {int u = FindSet(::u[x]), v = FindSet(::v[x]);if(u == v) continue;merge(u, v); ans += val[x];}return printf("%lld\n", ans), del(now), void();}for(auto x : g) val[x] = w[x], flg[x] = 2; for(auto x : vec[p]) val[x] = inf;sort(g.begin(), g.end(), [](int i, int j) {return val[i] < val[j];});for(auto x : g) {int u = FindSet(::u[x]), v = FindSet(::v[x]);if(u == v) {if(val[x] != inf) flg[x] = 0; continue;}merge(u, v);} del(now);for(auto x : vec[p]) val[x] = -inf;sort(g.begin(), g.end(), [](int i, int j) {return val[i] < val[j];});for(auto x : g) {int u = FindSet(::u[x]), v = FindSet(::v[x]);if(u == v) continue;if(val[x] != -inf) flg[x] = 1; merge(u, v);} del(now);for(auto x : g) val[x] = w[x];for(auto x : g) if(flg[x] == 1) {int u = FindSet(::u[x]), v = FindSet(::v[x]);if(u != v) merge(u, v), ans += w[x];} else if(flg[x] == 2) vc.push_back(x);solve(p << 1, l, mid, ans, vc), solve(p << 1 | 1, mid + 1, r, ans, vc), del(now);
}
signed main() {scanf("%lld %lld %lld", &n, &m, &q);for(int i = 1; i <= n; i++) fa[i] = i, siz[i] = 1;for(int i = 1; i <= m; i++) scanf("%lld %lld %lld", &u[i], &v[i], &w[i]), val[i] = w[i];for(int i = 1; i <= q; i++) scanf("%lld %lld", &a[i], &b[i]), insert(1, 1, q, i, a[i]);vector<int> g; for(int i = 1; i <= m; i++) g.push_back(i);solve(1, 1, q, 0, g);return 0;
}

UOJ176 新年的繁荣

首先发现若存在两个点它们的权值相同,将它们之间连上边肯定是优的。

考虑剩下权值互不相同的点。容易发现权值很小,于是考虑枚举权值,记为 \(i\)

每次需要找到 \(x\ and\ y=i\)\(x,y\) 不在一个连通块中的点,并将它们连上边。

但这样时间复杂度不对。可以考虑将 \(x\) 下放到 \(x\) 的子集中,就只需要枚举 \(i\ or\ 2^j\) 即可。

APIO2008 免费道路

sol1

将第 \(i\) 条边附上权值 \(i\),然后跑一边与 P2619 Tree I 相同的二分即可。

sol2

我们可以先找出所有必须被选择的鹅卵石路,可以通过一次最小生成树来解决。

然后将这些鹅卵石路强制选上,之后再优先选鹅卵石路直到选了 \(k\) 条,也可以通过一次最小生成树来解决。

AGC037D Sorting a Grid

若能够使 \(C\) 变成 \(D\),那么 \(C\) 需要满足 \(C\) 的每一行上的数与 \(D\) 的对应行上的数重排后相同。

若能够使 \(B\) 变成 \(C\),那么 \(B\) 需要满足 \(B\) 的每一列上在 \(D\) 中的行(颜色)互不相同。

让我们依次枚举每一列,我们可以将 \(A\) 的一行开一个点,将每种颜色开一个点,然后将行与上面有的颜色连一条边,然后跑一边二分图匹配。

每次找到的一个完美匹配就可以确定 \(B\) 的一列。

容易从 \(B\) 变到 \(C\)

BZOJ4808 马

按照马移动的方式连边,然后跑一边最大匹配来求最大独立集。

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

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

相关文章

第一课 php基础语法 变量 函数

php语法<?php// 代码段   ?> php输出方法:echo 和 print不同点:echo-能够输出一个以上的字符串,英文逗号隔开print-只能输出一个字符串,并始终返回1echo 比 print 稍快,并且开销低 注释注释不会被作为程序来读取和执行。它唯一的作用是供代码编辑者阅读(让别人…

CentOS 8 停止维护后通过 rpm 包手动安装 docker

根据 Docker官方文档 的指引,进入 Docker rpm 包下载的地址,根据自己系统的架构和具体版本选择对应的路径这里我使用 https://download.docker.com/linux/centos/7/x86_64/stable 版本,根据 docker 官方的给出的安装命令选择性的下载对应的 rpm 包最终使用 yum 命令安装下载…

02 Vue默认项目说明

1. node_modules pnpm 安装的第三方依赖 2. public 公共资源,存放网页图标等 3. src 开发代码存放位置 3.1 项目入口文件 main.ts import { createApp } from vue // 引入vue import ./style.css // 引入默认样式 import App from ./App.vue // 引入页面 App.VuecreateApp(App…

解构UI设计

解构UI设计 第一章 界面类型 1.1 闪屏页 又称为启动页,就是APP启动在进入功能主界面前用户看到的页面。 闪屏页决定了用户对App的第一印象。 闪屏页显示的时间很短,通常只有1秒。 闪屏页分为品牌宣传型、节日关怀型和活动推广型3种类型。 1.1.1 品牌宣传型 App的闪屏页是为体…

创建新的 App 页面

完整的页面创建过程包括三个步骤:在 layout 目录下创建 XML 文件创建与 XML 文件对应的 Java 代码在 AndroidManifest.xml 中注册页面配置实现两个 Activity 相互跳转的代码: MainActivity: package com.example.myapplication1;import androidx.appcompat.app.AppCompatActiv…

[Vue] 异步路由组件和非路由组件的区别?

异步路由组件 都知道异步路由组件通过 () => import("./views/Home.vue") 导入路由组件。 但是它怎么就按需加载资源、代码分割了? 不同的代码解析报告 非异步路由组件异步路由组件

课上测试:位运算(AI)

2.使用位运算编写并调用下面函数,把当前时间(使用C库函数获得)设置到TIME中,给出代码,使用git记录过程。为了使用位运算将当前时间设置到一个自定义的 TIME 结构体或变量中(尽管通常我们不会直接用位运算来处理时间,因为时间通常是由多个独立的字段如小时、分钟、秒等组…

vue3 pinia 存数据

pinia是vue2中的vuex,状态管理,可以实现数据共享 1、先安装 npm install pinia2、在main.ts中进行创建和载入3、在src下新建store文件夹 定义存的文件 4、在组件中使用 此时控制台会有具体的值。

笑傲江湖单机版安装教程+虚拟机一键端+GM+10职业单人副本

今天给大家带来一款单机游戏的架设:笑傲江湖10职业单机版单人副本坐骑门徒新时装商完整任务。 另外:本人承接各种游戏架设(单机+联网) 本人为了学习和研究软件内含的设计思想和原理,带了架设教程仅供娱乐。 教程是本人亲自搭建成功的,绝对是完整可运行的,踩过的坑都给你…

Eplan插件 - 自由文本编辑器

前言 使用此插件可以快速完成对项目中的自由文本、路径功能文本的修改、删除等操作。 插件介绍 用户界面 插件UI界面进行了更新,相比较之前的插件界面风格更清爽简洁。功能介绍插件批量将选中文本中的源文本替换为修改文本。 插件支持多种选择方式,可以在绘图区选中文本,也可…

Logisim-015-偶校验检错

仓库地址 https://gitee.com/gitliang/logisim-to-cpu

Android开发:日志功能备忘

临时记一下吧,以后就直接复制粘贴这里面的好了。实现一个日志记录程序的运行状态,并且带上时间信息,可以写一个类灵活调用。 MyLog.java package com.example.networkaccessrestrictions;import static android.content.ContentValues.TAG;import android.content.Context; …