题意

\(n\)个人,每个人属于一个班级\(ci\),这些人会有些小团体(并查集)

两种操作:

  • \(1\) \(a\) \(b\),将\(a\)所在的集体和\(b\)所在的集体合并
  • \(2\) \(x\) \(y\),问在\(x\)的集体中有多少人在\(y\)班

分析

看\(1\)操作是并查集,每一个人一开始有一个权值,如果两个集体合并,那么需要将他们的权值合并

看上去就像是线段树合并(前段时间刚学的)

一开始所有人都有一个根,对于他们的班级权值为\(1\)

对于\(1\)操作,找到\(a\)和\(b\)的祖先节点,合并两者的线段树,并进行并查集合并

对于\(2\)操作,查询即可

数组要开大点,反正有\(1024MB\)

#pragma GCC optimize(3, "Ofast", "inline")

#include <bits/stdc++.h>

#define start ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define ll long long
//#define int ll
//#define ls st<<1
//#define rs st<<1|1
#define pii pair<int,int>
#define rep(z, x, y) for(int z=x;z<=y;++z)
#define repd(z, x, y) for(int z=x;z>=y;--z)
#define com bool operator<(const node &b)const
using namespace std;
mt19937 rnd(chrono::high_resolution_clock::now().time_since_epoch().count());
const int maxn = (ll) 1e7 + 5;
const int mod = 1e9 + 7;
const int inf = 0x3f3f3f3f;
int T = 1;
int ls[maxn], rs[maxn], val[maxn], n, tot;
int pre[maxn]; int find(int x) {
if (pre[x] != x)
pre[x] = find(pre[x]);
return pre[x];
} int rt[maxn]; void Modify(int &u, int l, int r, int p) {
if (!u) u = ++tot;
if (l == r) {
val[u]++;
return;
}
int mid = l + r >> 1;
if (p <= mid) Modify(ls[u], l, mid, p);
else Modify(rs[u], mid + 1, r, p);
} int merge(int u, int v, int l, int r) {
if (!u || !v) return u | v;
if (l == r) {
val[u] += val[v];
return u;
}
int mid = (l + r) >> 1;
ls[u] = merge(ls[u], ls[v], l, mid);
rs[u] = merge(rs[u], rs[v], mid + 1, r);
return u;
} int query(int u, int l, int r, int p) {
if (l == r)
return val[u];
int mid = l + r >> 1;
if (p <= mid) return query(ls[u], l, mid, p);
else return query(rs[u], mid + 1, r, p);
} void solve() {
int q;
cin >> n >> q;
rep(i, 1, n)rt[i] = i, pre[i] = i;
tot = n;
rep(i, 1, n) {
int c;
cin >> c;
Modify(rt[i], 1, n, c);
}
while (q--) {
int op, x, y;
cin >> op >> x >> y;
if (op == 1) {
x = find(x);
y = find(y);
if (x == y)
continue;
merge(rt[x], rt[y], 1, n);
pre[y] = x;
} else {
x = find(x);
cout << query(rt[x], 1, n, y) << '\n';
}
}
} signed main() {
start;
while (T--)
solve();
return 0;
}

AtCoder ABC183F Confluence的更多相关文章

  1. AtCoder Beginner Contest 183

    第二次ak,纪念一下. 比赛链接:https://atcoder.jp/contests/abc183/tasks A - ReLU 题解 模拟. 代码 #include <bits/stdc+ ...

  2. Confluence Wiki -- 页面限制

    Confluence Wiki 中 [页面设置] 应该如何理解? 当一个用户有这个权限后,这个用户可以对一个页面做限制,可以限制这个页面不能被其他用户浏览或编辑: 反之,如果没有这个权限,那么这个用户 ...

  3. jquery in confluence.

    https://confluence.atlassian.com/confkb/how-to-use-javascript-in-confluence-313458839.html https://a ...

  4. Recover lost Confluence password

    confluence重置admin密码 复方法: 1. 运行此sql 找到你的管理员帐户: select u.id, u.user_name, u.active from cwd_user u joi ...

  5. Confluence自启动脚本

    由于confluence用rc.local是无法自启动的,所以这里附上confluence的启动脚本 将以下脚本拷贝到/etc/init.d/confluenced # cd /etc/init.d/ ...

  6. confluence的安装、备份和恢复(wiki)

    还有一种比较不错的wiki工具MediaWiki 安装教程参考 http://pangge.blog.51cto.com/6013757/1560249 我是按照上面的教程搭建的 还有几篇不错的文章 ...

  7. confluence安装

    confluence安装 1.jre安装 java下载http://www.java.com/zh_CN/download/manual.jsp 创建目录和解压缩 mkdir -p /usr/loca ...

  8. [Tools]迁移Confluence, JIRA, Fisheye

    [背景] 原先的Confluence, JIRA, Fisheye都部署在一台服务器(192.168.200.203)上,导致这台机器太卡,公司又分配了两台虚拟机来分开这几个应用(192.168.20 ...

  9. confluence重置admin密码

    复方法: 1. 运行此sql 找到你的管理员帐户: select u.id, u.user_name, u.active from cwd_user u join cwd_membership m o ...

  10. Confluence部署攻略 [转]

    一.软件介绍 AtlassianConfluence(简称Confluence)是一个专业的wiki程序.它是一个知识管理的工具,通过它可以实现团队成员之间的协作和知识共享.Confluence不是一 ...

随机推荐

  1. vernemq 一个可用的入门指南之一:Mac下的安装及使用,使用MQTTX访问verneMQ

    因为百度到一篇简书的,不可用,所以写这么一篇,方便后来人 物联网的消息队列技术选型,很多地方会推荐使用VerneMQ,这里做一个安装实验记录,并非推荐. git clone https://githu ...

  2. [TSG开发]法如扫描仪SDK探幽-1.旧版SDK采集流程、问题解析、常见参数

    做什么 法如扫描仪是一个三维的激光扫描仪,可以通过特定的作业模式将空间以三维激光点云的形式保存下来,并且通过特定的算法得出一些想要的具体参数. 这个SDK探幽日志主要是对目前SDK开发中遇到的一些问题 ...

  3. OpenOffice4.1.6 linux安装/卸载教程

    以下是centos的安装方法 1.先安装并配置好jdk 2.拷贝 把Apache_OpenOffice_4.1.6_Linux_x86-64_install-rpm_zh-CN.tar.gz拷贝到自己 ...

  4. Python 列表、字典、元组的一些小技巧

    1. 字典排序 我们知道 Python 的内置 dictionary 数据类型是无序的,通过 key 来获取对应的 value.可是有时我们需要对 dictionary 中的 item 进行排序输出, ...

  5. Ascend C sqrt算子实战

    摘要:编写一个Ascend C的sqrt算子,并通过内核调用方式在cpu和npu模式下进行验证. 本文分享自华为云社区<[2023 · CANN训练营第一季]--Ascend C sqrt算子实 ...

  6. Spring Boot实现高质量的CRUD-2

    (续前文) 5.Dao类 ​ ​ Dao类提供操作访问数据库表的接口方法.常规的CRUD,将考虑下列接口方法: ​ 1)插入单条对象记录: ​ 2)批量插入对象记录: ​ 3)修改单条对象记录: ​ ...

  7. php发起支付加密数据供获取订单状态使用

    <?php//作者主页: https://www.bz80.comnamespace Index\Controller; class PayController extends BaseCont ...

  8. 把langchain跑起来的3个方法

    使用LangChain开发LLM应用时,需要机器进行GLM部署,好多同学第一步就被劝退了,那么如何绕过这个步骤先学习LLM模型的应用,对Langchain进行快速上手?本片讲解3个把LangChain ...

  9. Unity的Undo:详解解析与实用案例

    Unity Undo详解 在Unity中,Undo是一个非常重要的功能,它可以让开发者在编辑器中进行操作时,随时撤销之前的操作,从而避免不必要的错误.本文将详细介绍Unity Undo实现原理和使用方 ...

  10. pgrep:根据名称或其他属性查找进程(查找系统中running状态的进程)

    用法示例 # 根据名称过滤 dewan Work ~/code/shell% pgrep qemu 3570191 dewan Work ~/code/shell% pgrep qemu -l 357 ...