[APIO2020]交换城市(交互+kruskal重构树)
[APIO2020]交换城市
description
solution
如果u,vu,vu,v存在于一条链上(只有两个点度数为111其余点度数为222)则无解,否则必有解
如图,不管是哪个点度数>2>2>2,都可以有解
以蓝色为例,第二个红点右移到蓝色右边,第一个红点走进蓝色,第二个红点走到第一个红点开始位置,第一个红点出来回到第二个红点开始位置
因此本题只是在kruskal
重构树(每次新建一个点,把两个点连在新点下面当儿子,新点点权即为原两点的边权)的基础上多了一个链判断的维护
不需要用启发式合并,只需要判断siz[u]=cnt[u][1]+cnt[u][2]&&cnt[u][1]==2
code
#include "swap.h"
#include <bits/stdc++.h>
using namespace std;
#define maxn 300005
struct node {int u, v, w;node(){}node( int U, int V, int W ) {u = U, v = V, w = W;}
}edge[maxn];
vector < int > G[maxn];
int n, m, ip;
int MS[maxn], d[maxn], val[maxn], siz[maxn], g[maxn], dep[maxn];
int f[maxn][20], cnt[maxn][3];bool cmp ( node x, node y ) {return x.w < y.w;
}int find( int x ) {return x == MS[x] ? x : MS[x] = find( MS[x] );
}void dfs( int u, int fa ) {f[u][0] = fa, dep[u] = dep[fa] + 1;for( int i = 1;i < 20;i ++ )f[u][i] = f[f[u][i - 1]][i - 1];if( cnt[u][1] == 2 && cnt[u][1] + cnt[u][2] == siz[u] ) g[u] = g[fa];else g[u] = u;for( int i = 0;i < ( int )G[u].size();i ++ ) {int v = G[u][i];if( v == fa ) continue;else dfs( v, u );}
}void modify( int x, int v ) {if( 1 <= d[x] && d[x] <= 2 ) cnt[find( x )][d[x]] += v;
}void kruskal() {sort( edge + 1, edge + m + 1, cmp );for( int i = 1;i <= n;i ++ ) MS[i] = i, siz[i] = 1;ip = n;for( int i = 1;i <= m;i ++ ) {int u = edge[i].u, v = edge[i].v, w = edge[i].w;int fu = find( u ), fv = find( v );if( fu ^ fv ) {++ ip;cnt[ip][1] = cnt[fu][1] + cnt[fv][1];cnt[ip][2] = cnt[fu][2] + cnt[fv][2];siz[ip] = siz[fu] + siz[fv];MS[fu] = ip, MS[fv] = ip;val[ip] = w;MS[ip] = ip;G[ip].push_back( fu );G[ip].push_back( fv );}else if( val[fu] != w ) {++ ip;cnt[ip][1] = cnt[fu][1];cnt[ip][2] = cnt[fu][2];siz[ip] = siz[fu];MS[fu] = ip;MS[ip] = ip;val[ip] = w;G[ip].push_back( fu );}modify( u, -1 );modify( v, -1 );d[u] ++;d[v] ++;modify( u, 1 );modify( v, 1 );}dfs( ip, 0 );
}int get_lca( int u, int v ) {if( dep[u] < dep[v] ) swap( u, v );for( int i = 19;~ i;i -- )if( dep[f[u][i]] >= dep[v] )u = f[u][i];if( u == v ) return u;for( int i = 19;~ i;i -- )if( f[u][i] != f[v][i] )u = f[u][i], v = f[v][i];return f[u][0];
}void init( int N, int M, vector < int > U, vector < int > V, vector < int > W ) {n = N, m = M;for( int i = 0;i < m;i ++ )edge[i + 1] = node( U[i] + 1, V[i] + 1, W[i] ); kruskal();
}int getMinimumFuelCapacity( int x, int y ) {x ++, y ++;int lca = get_lca( x, y );if( ! g[lca] ) return -1;else return val[g[lca]];
}
完全不能调试的交互题!!!
[APIO2020]交换城市(交互+kruskal重构树)相关推荐
- [NOI2018] 归程(线段树维护并查集的可持久化/kruskal重构树,倍增+dijkstra最短路)
[NOI2018] 归程 description solution1 code1 solution2 code description 题目描述 本题的故事发生在魔力之都,在这里我们将为你介绍一些必要 ...
- LOJ.2865.[IOI2018]狼人(Kruskal重构树 主席树)
LOJ 洛谷 这题不就是Peaks(加强版)或者归程么..这算是\(IOI2018\)撞上\(NOI2018\)的题了? \(Kruskal\)重构树(具体是所有点按从小到大/从大到小的顺序,依次加入 ...
- 浅谈kruskal重构树
食用须知: *因为临时改动,代码不一定完全正确. *以下概念来自个人理解,并不十分准确.慎! <Kruskal重构树思想与模板> Kruskal算法(维护无向图的最小生成森林):每一时刻, ...
- 洛谷P4768 [NOI2018]归程(Kruskal重构树)
题意 直接看题目吧,不好描述 Sol 考虑暴力做法 首先预处理出从$1$到每个节点的最短路, 对于每次询问,暴力的从这个点BFS,从能走到的点里面取$min$ 考虑如何优化,这里要用到Kruskal重 ...
- 【NOI 2018】归程(Kruskal重构树)
题面在这里就不放了. 同步赛在做这个题的时候,心里有点纠结,很容易想到离线的做法,将边和询问一起按水位线排序,模拟水位下降,维护当前的各个联通块中距离$1$最近的距离,每次遇到询问时输出所在联通块的信 ...
- kruskal 重构树(讲解 + 例题)
kruskal重构树 如何建树 模仿kruskalkruskalkruskal,先将所有边排序. 依次遍历每一条边,如果这条边的两个节点(u,vu, vu,v)不在同一个连通块里面, 则新建一个nod ...
- Network 黑暗爆炸 - 3732 倍增lca || Kruskal重构树
传送门 文章目录 题意: 思路: 题意: 思路: 两点间最长边最小值一定是最小生成树上两点间的最大值,这个比较容易证,就不多说了. 知道这个结论后, 我们直接跑一个KruskalKruskalKrus ...
- [ONTAK2010] Peaks加强版 (kruskal重构树+主席树+倍增)
Peaks description solution code description 在Bytemountains有N座山峰,每座山峰有他的高度h_i 有些山峰之间有双向道路相连,共M条路径,每条路 ...
- AGC002(D~F)【Kruskal重构树,博弈论,dp】
正题 AT1998 [AGC002D] Stamp Rally[Kruskal重构树,倍增] https://www.luogu.com.cn/problem/AT1998 题目大意 给出nnn个点m ...
最新文章
- python闭包主要解决什么问题_关于python中闭包的总结
- java中截取字符串的方式
- SPOJ 1676 矩阵乘法+DP
- mysql移动文件后打不开_Windows端MySQL data目录迁移(貌似会启动不了)
- 【Flink】Flink时间之internalTimerService初始化
- python 基础 集合
- c语言贪吃蛇 纯c,纯C语言贪吃蛇游戏
- 计算机论文中期考核报告,硕士学位论文中期检查表范文_中期检查报告范文_中期考核 修改论文题目...
- 1位全加器设计—— 原理图与VHDL设计初步
- 如何查看计算机主机名称,查看和修改主机名
- 三维实时云渲染平台解决方案
- 基于JAVA自行车在线租赁管理系统2021计算机毕业设计源码+系统+lw文档+部署
- codeforces 607B Zuma 区间dp
- mac屏幕保护SaveHollywood安装方法
- 【渝粤教育】广东开放大学 广东开放大学学习指引 形成性考核 (28)
- Java斗_Java集合练习:斗地主游戏
- 热动力数据MATLAB代码分享
- 解密支付宝所谓黑科技神码
- 【java毕业设计】基于javaEE+原生Servlet+MySql的Web停车场管理系统设计与实现(毕业论文+程序源码)——停车场管理系统
- 第十二章:项目采购管理 - (12.0 什么是项目采购管理)