ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Codeforces 1617E. Christmas Chocolates (~2400)

2021-12-17 01:33:24  阅读:282  来源: 互联网

标签:le int text Chocolates Codeforces dep mp 操作 Christmas


题目描述

给定一个长度为 \(n\) 的序列 \(a\)。挑出两个数 \(a_x,a_y(x\neq y)\) 使得让 \(a_x=a_y\) 的最小操作数最大。
一次操作是选择一个非负整数 \(k\),使得 \(2^k\geq a_i\),然后令 \(a_i\leftarrow 2^k-a_i\)。
\(2\le n\le 2\cdot 10^5,0\le a_i\le 10^9\)。

有史以来最简单的 \(\color{red}{\text{Div2 }}\color{purple}{\text{E}}\)。

首先可以考虑若已知 \(a_x,a_y\),让 \(a_x=a_y\) 大概是怎样的操作。将这个操作对应到二进制上相当于是将 \(\text{lowbit}(a_i)\) 前面的位全部取反,且操作是可逆的。
操作过程即是 \(a_x\) 先不断变小一段\((\)可能为空\()\),再不断变大一段\((\)可能为空\()\)。
不妨设 \(a_x>a_y\),若 \(a_x\) 二进制中最高位为 \(1\) 但在 \(a_y\) 中却没有此位那么显然 \(k\) 不会取到最高位前面去,不然就会产生多余的 \(1\),还需要额外的操作来抵消。

由于操作可逆,可以考虑建图,只需要考虑每个 \(a_i\) 变成 \(0\) 的过程。此时每次操作必定会用到最小的 \(k\) 满足 \(2^k\ge a_i\),再对 \(a_i\) 进行操作。在操作前后的 \(a_i\) 之间建边,单个数的操作数是 \(O(\log a_i)\) 的,所以总点数为 \(O(n\log \max a_i)\)。

于是题目转化成找这 \(n\) 个点在树上两两距离的最大值,两遍 \(dfs\) 即可。时间复杂度 \(O(n\log \max a_i)\)。

\(\color{blue}{\text{code}}\)

#include <bits/stdc++.h>
using namespace std;
const int N = 6e6 + 5, M = 2e5 + 5;
int n, tot, a[M], dep[N]; vector <int> G[N];
unordered_map <int, int> mp;
inline int op(int x) {
	int pw = log2(x);
	if ((1 << pw) >= x) return (1 << pw) - x;
	return (1 << pw + 1) - x;
}
inline void dfs(int x, int fa) {
	dep[x] = fa ? dep[fa] + 1 : 0;
	for (auto y : G[x]) if (y ^ fa) dfs(y, x);
}
int main() {
	scanf("%d", &n), mp[0] = tot = 1;
	for (int i = 1; i <= n; ++ i) {
		scanf("%d", a + i); int p = a[i]; if (mp[p]) continue;
		mp[p] = ++ tot; int nxt = op(p);
		while (!mp[nxt]) {
			mp[nxt] = ++ tot, G[mp[nxt]].emplace_back(mp[p]), G[mp[p]].emplace_back(mp[nxt]);
			p = nxt, nxt = op(p);
		}
		G[mp[nxt]].emplace_back(mp[p]), G[mp[p]].emplace_back(mp[nxt]);
	}
	dfs(mp[a[1]], 0); int p = 1; for (int i = 2; i <= n; ++ i) if (dep[mp[a[i]]] > dep[mp[a[p]]]) p = i;
	dfs(mp[a[p]], 0); int q = 1; for (int i = 2; i <= n; ++ i) if (dep[mp[a[i]]] > dep[mp[a[q]]]) q = i;
	return printf("%d %d %d\n", p, q, dep[mp[a[q]]]), 0;
}

标签:le,int,text,Chocolates,Codeforces,dep,mp,操作,Christmas
来源: https://www.cnblogs.com/Samsara-soul/p/Codeforces-1617E-solution.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有