首页 > 其他分享 >ABC302Ex Ball Collector 题解

ABC302Ex Ball Collector 题解

时间:2023-06-03 23:01:08浏览次数:44  
标签:siz cnte Ball 10 int 题解 ABC302Ex getrt res

注意到当有那些 \((a_i,b_i)\) 是确定的时,答案就是将 \((a_i,b_i)\) 连边后每个连通块的 \(\min(|V|,|E|)\) 之和。

那么这个东西用可撤销并查集维护即可。

#include <algorithm>
#include <cstdio>
using namespace std;

const int N = 2e5;

struct Edge {
  int to, nxt;
} e[N * 2 + 10];
int head[N + 10], tote;
inline void addEdge(int u, int v) {
  e[++tote] = {v, head[u]};
  head[u] = tote;
}

int n, a[N + 10], b[N + 10], ans[N + 10];
int f[N + 10], cnte[N + 10], cntv[N + 10], res;
int hst[N + 10], toth;

int getrt(int x) {
  return f[x] == x ? x : getrt(f[x]);
}

inline int siz(int u) { return min(cntv[u], cnte[u]); }

void merge(int u, int v) {
  if (getrt(u) == getrt(v)) {
    u = getrt(u);
    res -= siz(u);
    cnte[u]++;
    res += siz(u);
    hst[++toth] = u;
  } else {
    u = getrt(u), v = getrt(v);
    if (cntv[u] < cntv[v]) swap(u, v);
    res -= siz(u) + siz(v);
    cntv[u] += cntv[v];
    cnte[u] += cnte[v];
    cnte[u]++;
    f[v] = u;
    res += siz(u);
    hst[++toth] = v;
  }
}

void undo() {
  int u = hst[toth];
  hst[toth] = 0; toth--;
  if (u == getrt(u)) {
    res -= siz(u);
    cnte[u]--;
    res += siz(u);
  } else {
    int v = f[u];
    res -= siz(v);
    cntv[v] -= cntv[u];
    cnte[v] -= cnte[u];
    cnte[v]--;
    f[u] = u;
    res += siz(u) + siz(v);
  }
}

void dfs(int u, int fa) {
  merge(a[u], b[u]);
  ans[u] = res;
  for (int i = head[u]; i; i = e[i].nxt) {
    int v = e[i].to;
    if (v == fa) continue;
    dfs(v, u);
  }
  undo();
}

int main() {
  scanf("%d", &n);
  for (int i = 1; i <= n; i++)
    scanf("%d%d", a + i, b + i);
  for (int i = 1; i < n; i++) {
    int u, v; scanf("%d%d", &u, &v);
    addEdge(u, v), addEdge(v, u);
  }
  for (int i = 1; i <= n; i++) f[i] = i, cntv[i] = 1;
  dfs(1, 0);
  for (int i = 2; i <= n; i++)
    printf("%d%c", ans[i], " \n"[i == n]);
  return 0;
}

标签:siz,cnte,Ball,10,int,题解,ABC302Ex,getrt,res
From: https://www.cnblogs.com/registergen/p/abc302ex_solution.html

相关文章

  • 2023青岛市程序设计竞赛小学组题解
    1.付钱题目链接:https://www.luogu.com.cn/problem/U303904代码:#include<bits/stdc++.h>#definelllonglongusingnamespacestd;intmain(){ lln;cin>>n; cout<<n/100<<''<<(n%100)/50<<''<<(n%50)/20......
  • 第十届蓝桥杯c++b组国赛题解(还在持续更新中...)
    试题A:平方序列解题思路:直接枚举一遍x的取值,然后按照题目给定的式子算出y,每次取x+y的最小值即可答案为7020代码实现:#include<iostream>#include<algorithm>#include<cmath>usingnamespacestd;#defineintlonglongconstintN=1e4+5;signedmain(){ //记录答案......
  • ABC215E 题解
    前言题目传送门!更好的阅读体验?萌萌DP题。思路题目就是在说从\(a\)里面按顺序掏出来一些字母,使得相同的字母都是相邻的(比如AABBBBCD可行,AAABBCAA不行)。看起来很不可做,突破口在于\(\text{A}\sim\text{J}\)一共只有\(10\)个字母,考虑状压。设\(dp_{i,s}\)表示......
  • 道路翻修题解
    \(\mathcal{Description}\)给定一张无向图,为每条边定向,定义每个点的价值为出度与入度之差的绝对值,求最大价值和。对于\(40\%\)的数据,\(1\leqn,m\leq20\)。对于\(70\%\)的数据,\(1\leqn\leq17\)。对于\(90\%\)的数据,\(1\leqn\leq22\)。对于所有数据,\(1\leqn\leq25\)......
  • CF1808E3 题解
    题意传送门求有多少包含\(n\)位数码的\(k\)进制数,满足存在一位数等于其他\(n-1\)位数的总和模\(k\)。\(1\len\le10^{18},1\lek\le2000\)。题解简单的组合数学都不会了……蔬菜越来越多,我该怎么办?条件等价于存在某一位\(x\),满足\(2x\equivs\pmodk\)。容易想到......
  • P1545 [USACO04DEC] Dividing the Path G 题解
    丢一发好理解又好写的线段树优化dp。题目传送门简要题意给定一个长为\(l\)的线段,求出尽量少的不相交区间覆盖整段线段,要求题目给的所有子区间只被\(1\)个区间覆盖。分析显然题目给的子区间\([s,e]\)中只有\(s\)和\(e\)端点能作为线段端点,所以我们应该给\([s+1,......
  • 【Pytorch】ValueError: not enough values to unpack (expected 2, got 1)问题解决
    在运行开源项目时出现了这个问题,网上很多说删回车或者都改成英文符号,但是我都试了,没用后来自己摸索出的方法是:先更改数据集的格式,之前分隔符是\t,把数据集中的分隔符改成空格,再把语句中的\t也换成空格,然后就不会报错了。改前:改后:......
  • python pip安装库时遇到fatal error的问题解决
    当时的图片没有留,写点东西做备忘吧。一开始尝试pipinstallxx库,cmd提示pip不是批处理文件或命令,解决方法:去属性的高级设置里,在用户变量的Path里增加pip所在的路径,如果不知道pip在哪里,就在cmd里输入wherepip查询,查不到就在文件管理里用查询。解决这个问题后,再尝试安装,错误提示......
  • 杂项题解
    JOISC2017_JAbduction2由于权值较高的路不会被权值较低的路线影响,所以首先考虑将\(h+w\)条边按照权值降序排序,再考虑应该的最优决策方案。注意到每一条路都横跨原始的矩形,这样以出发点为中心向上下左右发散就会有4条边构成一个小矩形。考虑维护这个矩形每条边的最大路径......
  • [ROI 2018] Innophone 题解
    [ROI2018]Innophone看了半天网上仅有的一篇题解……才堪堪写出来不过在LOJ上看提交,全是KTT,看得我瑟瑟发抖(不会题意翻译在平面上有一些点,你需要在这个平面上任意确定一个点(不要求是给定的点),定义其贡献为横坐标\(\times\)其右侧的点\(+\)纵坐标\(\times\)其左上方的......