AtCoder Beginner Contest 392(A-G)题解

news/2025/2/14 4:29:21/

A-B:略

C:可能题意比较绕,第i个答案就是穿着i这个号码(也就是Q[j] = i,这个时候j这个位置),看向的那个人的号码(也就是P[j])

代码:

void solve()
{int n;cin >> n;vi p(n + 1), q(n + 1), ans(n + 1);rep(i, 1, n) {cin >> p[i];}rep(i, 1, n) {cin >> q[i];}rep(i, 1, n) {ans[q[i]] = q[p[i]];}rep(i, 1, n) {cout << ans[i] << ' ';}
}

D:枚举哪两个集合[i,j]计算贡献,用map记录每个集合每个元素a个数,最后枚举i和j中间最小那个map计算贡献即可。

void solve()
{int n;cin >> n;vector<map<int, int>> cnt(n + 1);vi k(n + 1);rep(i, 1, n) {cin >> k[i];int x;rep(j, 1, k[i]) {cin >> x;cnt[i][x]++;}}double ans = 0;rep(i, 1, n) {rep(j, i + 1, n) {if (sz(cnt[i]) < sz(cnt[j])) {double dw = 1.0 * k[i] * k[j];double up = 0;for (auto &[x, c] : cnt[i]) {if (cnt[j].count(x)) {up += 1.0 * cnt[j][x] * c;}}ans = max(ans, up / dw);} else {double dw = 1.0 * k[i] * k[j];double up = 0;for (auto &[x, c] : cnt[j]) {if (cnt[i].count(x)) {up += 1.0 * cnt[i][x] * c;}}ans = max(ans, up / dw);}}}cout << fixed << setprecision(10) << ans << '\n';
}

E:考虑用并查集把没用到的边筛除出来,然后每次根据没用到的边再根据所在连通块合并即可,直到最后只剩下一个连通块。

void solve()
{int n, m;cin >> n >> m;DSU dsu(n);vector<pii> edges(m + 1);vi vec;rep(i, 1, m) {int u, v;cin >> u >> v;edges[i] = {u, v};if (dsu.same(u, v)) {vec.pb(i);} else {dsu.merge(u, v);}}if (dsu.getBlocks() == 1) {cout << 0 << '\n';return;}set<int> st;rep(i, 1, n) {if (i == dsu.find(i)) {st.insert(i);}}vector<tuple<int, int, int>> ans;for (auto &i : vec) {auto [u, v] = edges[i];int t = v;u = dsu.find(u);v = dsu.find(v);st.erase(u);int z = *st.begin();st.erase(z);dsu.merge(u, z);ans.pb({i, t, z});st.insert(dsu.find(u));if (sz(st) == 1) {break;}}cout << sz(ans) << '\n';for (auto &[i, x, y]: ans) {cout << i << ' ' << x << ' ' << y << '\n';}
}

F:因为前面的总会被后面的顶掉,所以我们直接倒置放,一定不会被顶掉,每次从头开始找到未被放数字的第a[i]个位置,这个位置就是当前数字,寻找的过程可以通过维护线段树,每次放一个数字就可以把这个位置上的sum标成1,在线段树上二分这个sum去寻找位置,复杂度nlogn。

const int N = 5e5 + 5;
struct node {int l, r;int sum;
} tr[N << 2];void push_up(int u) {tr[u].sum = tr[u << 1].sum + tr[u << 1 | 1].sum;
}void build(int u, int l, int r) {tr[u] = {l, r, 0};if (l == r) {tr[u].sum = 1;return;}int mid = (l + r) >> 1;build(u << 1, l, mid);build(u << 1 | 1, mid + 1, r);push_up(u);
}void modify(int u, int p) {if (tr[u].l == tr[u].r) {tr[u].sum = 0;return;}int mid = (tr[u].l + tr[u].r) >> 1;if (p <= mid) {modify(u << 1, p);} else {modify(u << 1 | 1, p);}push_up(u);
}int find_pos(int u, int sum) {if (tr[u].l == tr[u].r) {return tr[u].l;}if (tr[u << 1].sum >= sum) {return find_pos(u << 1, sum);}return find_pos(u << 1 | 1, sum - tr[u << 1].sum);
}void solve()
{int n;cin >> n;vi a(n + 1);vi ans(n + 1);rep(i, 1, n) {cin >> a[i];}build(1, 1, n);per(i, n, 1) {int p = find_pos(1, a[i]);ans[p] = i;modify(1, p);}rep(i, 1, n) {cout << ans[i] << ' ';}
}

G:经典FFT,考虑把值域a[i]看成多项式的x^a[i],把方案数看成系数,最后把多项式相乘系数就是每个值的方案数,由于原式子可以化成A+C=2B,因此我们枚举2B,只可能是偶数,且B一定要出现在原来的a数组中,这就可以计算到答案中去。

void solve()
{vl A(1e6 + 1), B(1e6 + 1), C(1e6 + 1);int n;cin >> n;rep(i, 1, n) {int x;cin >> x;A[x]++;B[x]++;C[x]++;}auto ret = atcoder::convolution_ll(A, B);ll ans = 0;REP(i, 2, 2000000, 2) {if (C[i >> 1]) {ans += ret[i] / 2;}}cout << ans;
}


http://www.ppmy.cn/news/1570643.html

相关文章

Qt:Qt Creator项目创建

目录 认识Qt Creator Qt Creator概览 使用Qt Creator新建项目 选择项目模板 选择项目路径 选择构建系统 填写类信息设置界面 选择语言和翻译文件 选择Qt套件 选择版本控制系统 最终效果 认识Qt Creator Qt Creator概览 从开始菜单或者快捷方式打开Qt Creator集成开…

10vue3实战-----实现登录的基本功能

10vue3实战-----实现登录的基本功能 1.基本页面的搭建2.账号登录的验证规则配置3.点击登录按钮4.表单的校验5.账号的登录逻辑和登录状态保存6.定义IAccount对象类型 1.基本页面的搭建 大概需要搭建成这样子的页面: 具体的搭建界面就不多讲。各个项目都有自己的登录界面&#…

maven-依托管理

依赖配置 依赖: 之当前项目运行所需要的jar包,一个项目可以引入多个依赖 依赖传递 依赖具有传递性 直接依赖: 在当前项目中通过依赖配置建立的依赖关系 间接依赖: 被依赖的资源如果依赖其他资源, 当前项目间接依赖其他资源 如果A不想要B依赖的 x 资源, 就在A依赖B的标签内加…

NUMA 配置对 Redis 使用的影响:提升性能的秘密武器

NUMA 配置对 Redis 使用的影响:提升性能的秘密武器 在高性能数据库部署中,Redis 已成为不少企业的缓存与消息队列首选。然而,在大规模服务器上运行 Redis 时,如果不注意底层硬件架构,性能就可能大打折扣。今天,我们就来聊聊 NUMA(Non-Uniform Memory Access,非统一内存…

洛谷P8742 [蓝桥杯 2021 省 AB] 砝码称重(dp初始)

归纳蓝桥杯的这道题总结了一定对于dp的看法&#xff0c;虽然还没看到y总的动态规划&#xff0c;自己搜了搜上学期算法中学到的01背包问题。 首先动态规划问题最重要的是状态转移方程&#xff0c;将问题抽象成数学问题&#xff0c;列出方程就可以得解。 #include<cstdio> …

334递增的三元子序列贪心算法(思路解析+源码)

文章目录 题目思路解析源码总结题目 思路解析 有两种解法:解法一:动态规划(利用dp找到数组最长递增序列长度,判断是否大于3即可)本题不适用,因为时间复杂度为O(n^2),超时。 解法二:贪心算法:解法如上图,题目要求长度为三,设置第一个元素为长度1的值,是指长度二的…

ZooKeeper作为注册中心有什么问题? ZooKeeper作为注册中心,海量服务同时重启有什么问题?

目录 ZooKeeper作为注册中心存在的问题 性能瓶颈 一致性保证 复杂性 扩展性 单点故障 数据模型限制 社区和生态 安全性 总结 ZooKeeper作为注册中心,海量服务同时重启有的问题 1. ZooKeeper集群压力剧增 2. ZooKeeper Leader节点压力 3. 会话和临时节点管理 4.…

33.日常算法

1.螺旋矩阵 题目来源 给你一个 m 行 n 列的矩阵 matrix &#xff0c;请按照 顺时针螺旋顺序 &#xff0c;返回矩阵中的所有元素。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,2,3],[4,5,6],[7,8,9]] 输出&#xff1a;[1,2,3,6,9,8,7,4,5] class Solution { public:vec…