首页 > 其他分享 >题解笔记

题解笔记

时间:2024-04-27 10:11:24浏览次数:18  
标签:cnt int 题解 findd 笔记 fa dx define

P1196 银河英雄传说
带权并查集(根搭积木很像):

对于每个点,分别记录所属链的头结点、该点到头结点的距离以及它所在集合的大小。

每次合并将y接在x的尾部,改变y头的权值和所属链的头结点,同时改变x的尾节点。

注意:每次查找的时候也要维护每个节点的权值。

每次查询时计算两点的权值差。

代码(含模板):

#include <bits/stdc++.h>
#define int ll
using namespace std;

using ll = long long;

#define R(i, a, b) for (int i = (a); i <= (b); ++i)
#define P(i, a, b) for (int i = (b); i >= (a); --i)
#define F(v, ...) for (auto __VA_ARGS__ : v)
#define lb(a) for (; a; a -= (a & -a))
#define lc(x, a) for (; x <= a; x += (x & -x))

char buf[1 << 20], *p1 = buf, *p2 = buf;
#define getc() (p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1 << 20, stdin), p1 == p2) ? EOF : *p1++)
#define putc(x) putchar(x)
inline int read() {
    int x = 0, sgn = 0; char s = getc();
    while(!isdigit(s)) sgn |= s == '-', s = getc();
    while(isdigit(s)) x = x * 10 + s - '0', s = getc();
    return sgn ? -x : x;
}
inline void print(int x) { if(x >= 10) print(x / 10); putc(x % 10 + '0'); }

bool Mbe;
int t;
int cnt[30007],fa[30007],dis[30007];

int findd(int x){
	if(fa[x]==x)return x;
	int k=fa[x];
	fa[x]=findd(fa[x]);
	dis[x]+=dis[k];
	
	cnt[x]=cnt[fa[x]];
	return fa[x];
//	return fa[x]==x?x:fa[x]=findd(fa[x]);
}
void unionn(int x,int y){
	//union x to y
//	cnt[y]+=cnt[x];
//	cnt[x]=0;
	int dx=findd(x),dy=findd(y);
	fa[dx]=dy;
	dis[dx]+=cnt[dy];
	cnt[dy]+=cnt[dx];
	cnt[dx]=cnt[dy];
}

bool Med;

signed main() {
	for(int i=1;i<=30004;++i)fa[i]=i;
	for(int i=1;i<=30002;++i)cnt[i]=1;
	for(int i=1;i<=30002;++i)dis[i]=0;
	scanf("%lld",&t);
	while(t--){
		int x,y;
		char ch;
		cin>>ch;
		scanf("%lld%lld",&x,&y);
		if(ch=='M'){
			unionn(x,y);
		}
		else{
			if(findd(x)==findd(y)){
				cout<<abs(dis[x]-dis[y])-1<<endl;
			}
			else cout<<-1<<endl;
		}
	}
	
	fprintf(stderr, "%.3lf MB\n", (&Mbe - &Med) / 1048576.0);
	return 0;
}

标签:cnt,int,题解,findd,笔记,fa,dx,define
From: https://www.cnblogs.com/doujiamu/p/18161783

相关文章

  • 周末玩一下云技术,kvm 相关笔记
    由于需要将企业的很贵的显卡和主机装在一个虚拟主机,用来跑 ue5和sd3 用来给用户临时使用,但是怎么将主机虚拟出来成多个主机呢,自己没有有钱请不起人,只能自己学一下虚拟化技术,第一步主机开启硬件支持,grep-E'vmx|svm'/proc/cpuinfo命令的功能是在/proc/cpuinfo文件中搜索......
  • 「洛谷」题解:P1008 三连击
    题目传送门题目背景本题为提交答案题,您可以写程序或手算在本机上算出答案后,直接提交答案文本,也可提交答案生成程序。题目描述将\(1,2,\ldots,9\)共\(9\)个数分成\(3\)组,分别组成\(3\)个三位数,且使这\(3\)个三位数构成\(1:2:3\)的比例,试求出所有满足条件的......
  • [题解][2021浙江CCPC] Shortest Path Query
    题目描述输入一张无向图,对于无向图的每条边u,v,w,将u和v转换成二进制后,u是v的前缀。给出q次询问,每次输入s,t,求s到t的最短距离。题解从题目数据而言,n为1e5,m为2e5,显然一般的多源最短路算法无法完成。考虑此题的特殊性质:由于边仅可能从u连向以u为前缀的v,那么若建立一颗以1为根的完......
  • 高等数学笔记
    高等数学概念、公式及常用结论高等数学基本公式、常用拓展公式、常用结论、常用解法目录第一章函数极限连续常用的基本极限1-无穷型极限常用结论常用的等价无穷小洛必达法则求极限什么时候可以用洛必达法则洛必达法则的适应类型泰勒公式求极限利用单调有界准则求极......
  • 笔记资源整理
    如何查资料一、中国全国数据1、国务院:各类全国基础州,34个职部委职能相关数据2、国家统计局:各类全国月度、季度、年度、普查到塌,部分地方、部门、全球二、中国地方数据1、地方数据导航:收录全国各省市地方统计局官网链接2、地方球开放平台:全国各省市地区的数据集合平台,数据比......
  • P4707 重返现世 题解
    Description为了打开返回现世的大门,Yopilla需要制作开启大门的钥匙。Yopilla所在的迷失大陆有\(n\)种原料,只需要集齐任意\(k\)种,就可以开始制作。Yopilla来到了迷失大陆的核心地域。每个单位时间,这片地域就会随机生成一种原料。每种原料被生成的概率是不同的,第\(i\)种......
  • 低开开发笔记(五):修bug-深拷贝与浅拷贝
    好家伙 今天遇到一个bug 0.问题描述描述如下: 代码如下:copynodefunc(){this.copynode=this.model.selected},affixnode(){constid=this.model.selected.wid-1;constgoodnode=this.copynode......
  • [题解] [NOIP 2010] 饮水入城
    [题解][NOIP2010]饮水入城题目描述有一个\(n\timesm\)的矩阵,每一点的高度是\(h_{i,j}\)。矩阵的最下面一行是\(m\)个城市,现在要在第一行建水站为这些城市供水,水站建好后水可以从水站往别的点引水,只能从高处引向相邻的低处,如果一个城市存在可以给他引水的水站,则这个城......
  • [题解] [洛谷P4158] 粉刷匠
    [题解][洛谷P4158]粉刷匠题目描述有\(n\)个木板,每个木板有\(m\)个格子,所有格子最开始视为没有颜色。有\(0/1\)两种颜色,每次可以粉刷其中一块木板上一段连续的格子,总共可以粉刷\(t\)次。给出一组目标颜色,问最多可以将多少个格子粉刷成目标颜色。输入格式第一行包含......
  • 列表删除按钮,分页错位问题解决思路 table delete page loadTable
    列表删除按钮,分页错位问题解决思路this.$api('/xxx/xxx/deletexxx',{ids:id}).then(res=>{if(res.status!==20)returnthis.$Message.destroy()this.$Message.success('删除成功')if(this.tableData.leng......