题意

\(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. 使用增强版 singleflight 合并事件推送,效果炸裂!

    hello,大家好啊,我是小楼. 最近在工作中对 Go 的 singleflight 包做了下增强,解决了一个性能问题,这里记录下,希望对你也有所帮助. singleflight 是什么 single ...

  2. pupstudy的使用

    打开环境 点击管理--打开根目录 把靶场放在www文件夹里 网页打开127.0.0.1/靶场文件名即可

  3. VSCode 中利用 Remote SSH 连接远程服务器

    北京时间 2019 年 5 月 3 日,在 PyCon 2019 大会上,微软发布了 VS Code Remote.这是一个用来实现远程开发的功能插件,对于许多使用 Windows 进行开发,但是需要 ...

  4. in用不用索引,啥时候能用啥时候不能用,一文说清

    in/or到底能不能用索引应该是肯定的,但有时生效有时不生效,这个能不能量化计算?这是本文想讨论和解答的问题. in到底用不用索引感觉像一桩悬疑片!古早时期的面经,统一说不走索引,在一些程序员脑海中从 ...

  5. Dev 使用RibbonForm打开多标签窗体,主窗体的Text显示一个

    最近在开发Dev的项目,一般我们主窗体上边只需要显示应用程序的名称就行了,不需要显示打开Tab页签的名称,百度了很久不知道怎么解决,官方文档只说,RibbonForm的标题是一个组合文本,由Ribbo ...

  6. 记一次 .NET 某企业采购平台 崩溃分析

    一:背景 1. 讲故事 前段时间有个朋友找到我,说他们的程序有偶发崩溃的情况,让我帮忙看下怎么回事,针对这种 crash 的程序,用 AEDebug 的方式抓取一个便知,有了 dump 之后接下来就可 ...

  7. Python运维开发之路《函数进阶》

    面向对象类的进阶 抽象类 python 没有抽象类.接口的概念,所以要实现这种功能需要导入abc模块 py2:导入abc函数,_metaclass__ = abc.ABCMeta;在强制调用类下:@a ...

  8. 使用C#编写.NET分析器(完结)

    译者注 这是在Datadog公司任职的Kevin Gosse大佬使用C#编写.NET分析器的系列文章之一,在国内只有很少很少的人了解和研究.NET分析器,它常被用于APM(应用性能诊断).IDE.诊断 ...

  9. 备份Ubunut已安装的软件包并在新的Ubuntu 系统上恢复

    0.查看已安装列表 dpkg -L xxxx.deb 1.备份 安装apt-clone: $sudo apt-get install apt-clone 提供一个保存备份文件的位置.我们在 /back ...

  10. 关于在modelsim中 仿真 ROM IP核 读取不了 mif文件 的解决方法

    在modelsim中 仿真 ROM IP核 读取不了 mif文件 . 出现状况: 显示无法打开 rom_8x256.mif 文件 .点开modelsim下面文件的内存列表,可看到内存全为0. 查看自身 ...