首页 > 其他分享 >AT_hitachi2020_c ThREE 题解

AT_hitachi2020_c ThREE 题解

时间:2024-06-11 17:14:00浏览次数:25  
标签:size0 int 题解 hitachi2020 sum1 ThREE ++ MAXN ans

题意:给定一颗树,构造一个排列 \(p\) 使得对于每一对 \((x,y),dis(x,y)=3\),有 \(3 \mid p_x+p_y\) 或 \(3 \mid p_x \times p_y\)。

首先我们先将所有 \(p_i\) 都模上 \(3\)。

条件等价于每一对距离为 \(3\) 的 \((x,y)\),\(p_x\) 和 \(p_y\) 不同时为 \(1\) 或 \(2\)。

那先考虑如何填 \(1\),题意转化为将一些点涂黑,没有两个黑点的距离为 \(3\)。

会发现若所有的黑点的深度的奇偶性都相同,那么不可能有两个点的距离为奇数。所以构造方案为:把这些黑点全部填到深度为偶数的点上或者全部填到深度为奇数的点上。具体填偶还是奇取决于哪边的点数够。

填 \(2\) 的情况同理,\(0\) 就是剩下所有没被填的点。

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int MAXN = 2e5 + 10;
int n,head[MAXN],cnt,depth[MAXN],ans[MAXN],p[5] = {3,1,2,0,0};
vector <int> v[3];
struct Node {int u,v,nxt;}e[MAXN << 1];
inline void Add(int u,int v) {e[++cnt] = {u,v,head[u]};head[u] = cnt;}
inline void dfs(int u,int father) {
	depth[u] = depth[father] + 1,v[depth[u] % 2].emplace_back(u);
	for(int i = head[u]; ~ i;i = e[i].nxt) 
		if(e[i].v != father) dfs(e[i].v,u);
} signed main() {
	memset(head,-1,sizeof head); cin >> n;
	for(int i = 1,x,y;i < n;i++) 
		cin >> x >> y,Add(x,y),Add(y,x);
	dfs(1,0);
	int sum1 = n / 3 + (n % 3 == 1 || n % 3 == 2);
	int sum2 = n / 3 + (n % 3 == 2);
	int size0 = v[0].size(),size1 = v[1].size();
	if(size0 >= sum1) {
		for(int i = size0 - sum1;i < size0;i++) ans[v[0][i]] = 1;
		size0 -= sum1;
	} else {
		for(int i = size1 - sum1;i < size1;i++) ans[v[1][i]] = 1;
		size1 -= sum1;
	} if(size0 >= sum2) for(int i = 0;i < sum2;i++) ans[v[0][i]] = 2;
	else for(int i = 0;i < sum2;i++) ans[v[1][i]] = 2;
	for(int i = 1;i <= n;i++) 
		cout << p[ans[i]] << " ",p[ans[i]] += 3;
	return 0;
}

标签:size0,int,题解,hitachi2020,sum1,ThREE,++,MAXN,ans
From: https://www.cnblogs.com/Creeperl/p/18242358

相关文章

  • 嵌入式开发常见问题解决方法
    一、问题复现稳定复现问题才能正确的对问题进行定位、解决以及验证。一般来说,越容易复现的问题越容易解决。1.1模拟复现条件有的问题存在于特定的条件下,只需要模拟出现问题的条件即可复现。对于依赖外部输入的条件,如果条件比较复杂难以模拟可以考虑程序里预设直接进入对应......
  • Windows共享文件夹常见问题解决方法
    目录你不能访问此共享文件夹,因为你组织的安全策略阻止未经身份验证的来宾访问允许自己电脑去访问局域网其他电脑的共享文件允许局域网内别人电脑访问自己电脑的共享文件你不能访问此共享文件夹,因为你组织的安全策略阻止未经身份验证的来宾访问参考:https://blog.csdn.net/qq28574......
  • 启动应用程序出现efsui.exe找不到问题解决
    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题,如果是新手第一时间会认为是软件或游戏出错了,其实并不是这样,其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库,这时你可以下载这个efsui.exe文件(挑选合适的版本文件)把它放入......
  • 启动应用程序出现findstr.exe找不到问题解决
    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题,如果是新手第一时间会认为是软件或游戏出错了,其实并不是这样,其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库,这时你可以下载这个findstr.exe文件(挑选合适的版本文件)把它放......
  • 学习ThreeJS
    创建第一个应用  使用ThreeJS进行编程的时候,都是在调用newThree().XXX来实现方法,让我们先根据官方文档创建一个demohttps://threejs.org/docs/index.html#manual/zh/introduction/Creating-a-scene那我们需要什么东西才能让这个场景build起来呢?一个相机(camera),一般是使......
  • CF297C Splitting the Uniqueness 题解
    CF297CSplittingtheUniqueness题解非常好构造题,使我的草稿纸旋转。解法我们记输入的数组为aaa,需要输出的两个数组为b......
  • Atcoder357D题解(求解等比数列求和公式的推导)
    解题思路设连接之后的N等于Nlast,w=10^(N在10进制下的长度,例如N=5,那么w=10)Nlast=N+N*w+N*(w^2)+N*(w^3)+.....+N*(w^n)举个例子N=5,因为510进制的长度是1,所以w=10,那么Nlast=5+5*10(w)^1+5*10(w)^2+5*10(w)^3+......
  • Luogu P1784 数独 [ 模板 ] / P1074 靶形数独 题解 [ 蓝 ] [ 深搜 ] [ 剪枝 ] [ 卡常
    数独模板,靶形数独卡了2h,再也不想写数独了。思路显然是对每个格子进行枚举,类似八皇后的方法去做,朴素方法是由\((1,1)\)到\((9,9)\)遍历过去。优化我们人在做数独时,会优先选择已填格数多的行、列、区域,这样可以保证尝试次数少。同样,这一点在本题中也可以应用,但是有两......
  • [题解]P9432 [NAPC-#1] rStage5 - Hard Conveyors
    P9432[NAPC-#1]rStage5-HardConveyors题意简述给定一个\(N\)个节点的树形结构,其中有\(k\)个关键节点。接下来有\(q\)次询问,每次询问给定\(x,y\),请输出\(x\)到\(y\)至少经过一个关键点的最短路径。解题思路我们发现,这道题相当于让我们从\(x\)到\(y\)的简单路径上,额外扩展......
  • P10572 [JRKSJ R8] +1-1 题解
    样例给了我们一个很好的提示。观察样例中\(1\rightarrow4\)的路径,发现\(4\rightarrow5\)这条边走了两遍,再结合题目描述中不需要保证是简单路径的提示,我们发现:如果路径两侧分别是(\(\rightarrow\)(和)\(\rightarrow\))的话,那么中间不管怎么走都可以通过左右横跳来......