首页 > 其他分享 >AtCoder Beginner Contest 329 F

AtCoder Beginner Contest 329 F

时间:2023-11-23 23:12:54浏览次数:42  
标签:box AtCoder Beginner Contest int auto 方格 329

AtCoder Beginner Contest 329 F

F - Colored Ball (atcoder.jp)(启发式合并)

问题陈述

有 \(N\) 个编号为 \(1, 2, \ldots, N\) 的盒子。最初,盒子 \(i\) 中有一个颜色为 \(C_i\) 的小球。

给你\(Q\)个查询,你要按顺序处理。

每个查询都由一对整数 \((a,b)\) 给出,并要求您执行以下操作:

  • 将所有球从方格 \(a\) 移到方格 \(b\),然后打印方格 \(b\) 中不同颜色球的数量。

这里,方格 \(a\) 和 \(b\) 可能是空的。

题解

起初使用哈希直接模拟,但是这样会\(T\)成大傻子

赛后和学长讨论了一下,发现这题\(T\)的原因出了\(N,Q\)拉满以外也可能是总是把盒子中小球多的往少的合并,所以我们可以采用启发式合并,即每次把少的放进多的里面,如果是要我们大的往小的放,那我们可以直接交换盒子

#include <bits/stdc++.h>
#define debug(a) cout<<#a<<"="<<a<<'\n';

using namespace std;
using namespace std::chrono;
using i64 = long long;

typedef pair<i64, i64> PII;

int main() {
	ios::sync_with_stdio(false);
	cin.tie(nullptr);

	int N, Q;
	cin >> N >> Q;

	vector<unordered_map<int, int>> box(N + 1);
	vector<int> C(N + 1);

	for (int i = 1; i <= N; i ++) {
		cin >> C[i];
		box[i][C[i]] ++;
	}

	auto move = [&](int a, int b) {
		if (box[a].size() < box[b].size()) {
			for (auto &[x, y] : box[a]) {
				box[b][x] += y;
			}
			box[a].clear();
		} else {
			for (auto &[x, y] : box[b])
				box[a][x] += y;
			box[b].swap(box[a]);
			box[a].clear();
		}
		cout << box[b].size() << endl;
	};

	while (Q--) {
		int a, b;
		cin >> a >> b;
		move(a, b);
	}

	return 0;
}

标签:box,AtCoder,Beginner,Contest,int,auto,方格,329
From: https://www.cnblogs.com/Kescholar/p/17852730.html

相关文章

  • 2023-2024-1 20231329《计算机基础与程序设计》第9周学习总结
    作业信息这个作业属于哪个课程https://edu.cnblogs.com/campus/besti/2023-2024-1-CFAP这个作业要求在哪里https://www.cnblogs.com/rocedu/p/9577842.html#WEEK09这个作业的目标计算机科学概论第10,11章并完成云班课测试《C语言程序设计》第8章并完成云班课测试......
  • AtCoder Regular Contest 144 E GCD of Path Weights
    洛谷传送门AtCoder传送门喵喵题。考虑若所有点权都已确定,如何求\(1\)到\(n\)所有路径权值和的\(\gcd\)。考虑如何check一个\(x\)是否合法。\(x\)合法的充要条件是,把不能从\(1\)到达的点和不能到达\(n\)的点扔掉后,存在一组\(\{f_n\}\),使得对于每条\(u\tov\)......
  • [AtCoder Toyota2023 Spring Final] Git Gud
    拜谢MagicDuck大神。其次我很喜欢洛谷逆天翻译把大翻译成小……首先考虑算一下贡献,考虑每个点的深度,一开始都是1,进行合并以后相当于首先把两个端点的深度累计到答案里,然后再选择一边给它的联通块内每个点深度增加1。那么容易发现我们可以算贡献转化为每个联通块权值为它向外......
  • AtCoder Beginner Contest 329
    劳累一天不该写题,启发式合并都写错了A-Spread(abc329A)题目大意给定一个字符串,将每个字符输出出来,中间留个空格。解题思路遍历输出即可。神奇的代码#include<bits/stdc++.h>usingnamespacestd;usingLL=longlong;intmain(void){ios::sync_with_std......
  • AtCoder Beginner Contest(abc) 326
    B-326-likeNumbers难度:⭐题目大意如果一个三位数的百位和十位的乘积等于个位,那么这个数就是合法的;问大于等于n的最小的合法的数是多少;解题思路因为数据范围很小,所以可以直接暴力;神秘代码#include<bits/stdc++.h>#defineintlonglong#defineIOSios......
  • AtCoder Beginner Contest 329
    C-Countxxx题意是:给你一个字符串,求出字符串里面相同字母的子串数量思路:用map映射即可,取每个字母的最大长度,然后加起来usingnamespacestd;intmain(){ intn; strings; cin>>n>>s; map<char,int>mp; intct=1; for(inti=1;i<n;i++){ if(s[i]!=s[i-1]){ mp[s[......
  • AtCoder Beginner Contest 329 (ABC329)
    A.Spread不说了,代码。B.Next不说了,代码。C.CountxxxDescription给定一个长度为\(N\)的字符串\(S\),求\(S\)中非空连续,并且包含重复字符的连续子串长度。例如$S=$aaabaa,则它满足上述条件子串为a,aa,aaa,b。Solution这道题\(1\leN\le2\times10^5\),显然......
  • [ABC329E]Stamp
    为了方便,我们记\(T\)为印章。不可能出现上图的情况(或者说无效),区间都必须是左右端点严格递增的。发现新增一个区间,无非就是放在上面/下面两种情况。考虑用\(f[i][j]\)表示前\(i\)个字母全部匹配,且第\(i\)个字母恰好在最右侧的模式串的第\(j\)个位置是否可行。三种方......
  • 2023-2024-1 20232329易杨文轩《网络空间安全导论》第二章学习
    学期2023-2024-1学号:20232329《#学期2023-2024-1学号20232329《网络》第二周学习总结》教材学习内容总结教材学习中存在的问题和解决过程-问题1:现如今密码学发展到了什么样的高度?-问题1解决方案:-问题2:量子密码是否是“无懈可击”的?-问题2解决方案:-问题3:如今密码学卡......
  • AtCoder Beginner Contest(abc) 329
    B-Next难度:⭐题目大意给定n个数,输出其去重后的次大值;解题思路暴力就行;神秘代码#include<bits/stdc++.h>#defineintlonglong#defineIOSios::sync_with_stdio(false),cin.tie(0),cout.tie(0)#defineendl'\n'usingnamespacestd;constintN=2e......