J.绝妙的平衡

2024-02-27 23:44
文章标签 平衡 绝妙

本文主要是介绍J.绝妙的平衡,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

解题思路

  • 对于一个以染成红色的点为根的子树,要使其权值之和为3的倍数
  • 则与其子树中的红色点无关,至于白色点数有关
  • 若除去子树中的红色点后,剩余包括其自身共有k个
  • k==1,则无解,即只有一个红色叶子点
  • k\%3==1,则除自身为2外,子树中还要有一个白点为2,其余为1
  • k\%3==2,则除自身为2外,子树中白点全为1
  • k\%3==0,则全为1
  • 不用建树,用并查集维护集合,集合要么是全为白色,要么至多有一个红色
  • 对于白点向红色点的连边,并查集不用合并
import java.io.*;
import java.math.BigInteger;
import java.util.Arrays;
import java.util.BitSet;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.Map;
import java.util.PriorityQueue;
import java.util.Queue;
import java.util.Random;
import java.util.Stack;
import java.util.StringTokenizer;
import java.util.Vector;public class Main{static long md=(long)998244353;static long Linf=Long.MAX_VALUE/2;static int inf=Integer.MAX_VALUE/2;static int[] fa;static int[] size;static int find(int x) {if(x==fa[x])return x;else return fa[x]=find(fa[x]);}public static void main(String[] args) throws IOException{AReader input=new AReader();PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));int n=input.nextInt();String string=" "+input.next();char[] s=string.toCharArray();fa=new int[n+1];size=new int[n+1];for(int i=1;i<=n;++i) {fa[i]=i;size[i]=1;}for(int i=2;i<=n;++i) {int x=input.nextInt();if(s[i]=='R')continue;int fx=find(x);int fy=find(i);if(fx!=fy) {fa[fy]=fx;size[fx]+=size[fy];}}int[] needtwo=new int[n+1];int[] ans=new int[n+1];boolean ok=true;for(int i=1;i<=n;++i) {if(fa[i]!=i) {int x=fa[i];if(needtwo[x]!=0) {needtwo[x]--;ans[i]=2;}else {ans[i]=1;}continue;}int sheng=size[i]%3;if(sheng==0) {ans[i]=1;}else if(sheng==1){if(size[i]==1&&s[i]=='R') {ok=false;break;}needtwo[i]=1;ans[i]=2;}else if(sheng==2){ans[i]=2;}}if(!ok)out.print("-1");else {for(int i=1;i<=n;++i) {out.print(ans[i]);}}out.flush();out.close();}//System.out.println();//out.println();staticclass AReader{ BufferedReader bf;StringTokenizer st;BufferedWriter bw;public AReader(){bf=new BufferedReader(new InputStreamReader(System.in));st=new StringTokenizer("");bw=new BufferedWriter(new OutputStreamWriter(System.out));}public String nextLine() throws IOException{return bf.readLine();}public String next() throws IOException{while(!st.hasMoreTokens()){st=new StringTokenizer(bf.readLine());}return st.nextToken();}public char nextChar() throws IOException{//确定下一个token只有一个字符的时候再用return next().charAt(0);}public int nextInt() throws IOException{return Integer.parseInt(next());}public long nextLong() throws IOException{return Long.parseLong(next());}public double nextDouble() throws IOException{return Double.parseDouble(next());}public float nextFloat() throws IOException{return Float.parseFloat(next());}public byte nextByte() throws IOException{return Byte.parseByte(next());}public short nextShort() throws IOException{return Short.parseShort(next());}public BigInteger nextBigInteger() throws IOException{return new BigInteger(next());}public void println() throws IOException {bw.newLine();}public void println(int[] arr) throws IOException{for (int value : arr) {bw.write(value + " ");}println();}public void println(int l, int r, int[] arr) throws IOException{for (int i = l; i <= r; i ++) {bw.write(arr[i] + " ");}println();}public void println(int a) throws IOException{bw.write(String.valueOf(a));bw.newLine();}public void print(int a) throws IOException{bw.write(String.valueOf(a));}public void println(String a) throws IOException{bw.write(a);bw.newLine();}public void print(String a) throws IOException{bw.write(a);}public void println(long a) throws IOException{bw.write(String.valueOf(a));bw.newLine();}public void print(long a) throws IOException{bw.write(String.valueOf(a));}public void println(double a) throws IOException{bw.write(String.valueOf(a));bw.newLine();}public void print(double a) throws IOException{bw.write(String.valueOf(a));}public void print(char a) throws IOException{bw.write(String.valueOf(a));}public void println(char a) throws IOException{bw.write(String.valueOf(a));bw.newLine();}}
}

 

这篇关于J.绝妙的平衡的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/753907

相关文章

剑指offer(C++)--平衡二叉树

题目 输入一棵二叉树,判断该二叉树是否是平衡二叉树。 class Solution {public:bool IsBalanced_Solution(TreeNode* pRoot) {if(pRoot==NULL)return true;int left_depth = getdepth(pRoot->left);int right_depth = getdepth(pRoot->rig

从零开始学数据结构系列之第三章《平衡二叉树基础概念》

文章目录 前言什么是平衡二叉树往期回顾 前言 ​   在前面的学习过程中,我们了解到二叉排序树可以在一定程度上提高查找(搜索)的效率,但仍然会出现特殊情况,让二叉排序树失效。例如,将序列{1,2,3,4,5,6}中的元素依次插入到二叉排序树中,会得到右斜树,这就相当于一个单链表了,搜索效率降低为O(n)。   于是在 1962 年,一个姓 AV 的大佬(G. M. Ade

【C++】平衡二叉树(AVL树)的实现

目录 一、AVL树的概念二、AVL树的实现1、AVL树的定义2. 平衡二叉树的插入2.1 按照二叉排序树的方式插入并更新平衡因子2.2 AVL树的旋转2.2.1 新节点插入较高左子树的左侧(LL平衡旋转)2.2.2 新节点插入较高右子树的右侧(RR平衡旋转)2.2.3 新节点插入较高左子树的右侧(LR平衡旋转)2.2.4 新节点插入较高右子树的左侧(RL平衡旋转)2.2.5 总结 3 平衡

LabVIEW项目管理中如何平衡成本、时间和质量

在LabVIEW项目管理中,平衡成本、时间和质量是实现项目成功的关键。通过制定详细的项目计划、合理分配资源、严格控制进度、进行质量保证和灵活应对变化,项目管理者可以有效地协调这三者的关系,确保项目按时、按质、按预算完成。 1. 制定详细的项目计划 分析:制定详细的项目计划是平衡成本、时间和质量的基础。一个详尽的计划能够明确项目的目标、范围、任务和里程碑,帮助项目团队有序推进项目。 措

视频剪辑技巧大揭秘:轻松掌握为视频添加梦幻光晕效果的绝妙方法!

在这个视觉盛宴的时代,每一个画面都渴望被赋予独特的魅力与魔法。今天,我要为你揭秘一个神秘的视频剪辑技巧——给视频添加光晕效果,让你的作品瞬间脱颖而出,成为朋友圈的焦点 首先,你可以打开原视频进行查看。此时,你会发现视频中的画面虽然真实,但却缺乏那种令人心动的梦幻感。不要担心,这正是我们接下来要为你解决的难题! 当你打开视频剪辑高手的主页面,首先映入眼帘的便是简洁明了的操作界面和高效实用

代码随想录训练营第十五天 110平衡二叉树 257二叉树的所有路径 404左子树之和 222完全二叉树的节点

第一题: 原题链接:110. 平衡二叉树 - 力扣(LeetCode) 首先什么事平衡二叉树:平衡二叉树 是指该树所有节点的左右子树的深度相差不超过 1。 思路: 首先我们要定义返回值和传入的参数,传入的参数就是当前传入节点,返回值是传入节点为根节点的树的高度。 现在要标记的是左右子树的差值是否大于1,那么如果当前传入节点为根节点的二叉树已经不是儿二叉平衡树的话,还返回高度的话就没有意义

算法训练营day15--110.平衡二叉树+ 257. 二叉树的所有路径+ 404.左叶子之和+222.完全二叉树的节点个数

一、110.平衡二叉树 题目链接:https://leetcode.cn/problems/balanced-binary-tree/ 文章讲解:https://programmercarl.com/0110.%E5%B9%B3%E8%A1%A1%E4%BA%8C%E5%8F%89%E6%A0%91.html 视频讲解:https://www.bilibili.com/video/BV1Ug41

leetcode-13-[110]平衡二叉树[257]二叉树的所有路径[404]左叶子之和[222]完全二叉树的节点个数

一、[110]平衡二叉树 注意:注释的1、2两处得有返回值-1 class Solution {public boolean isBalanced(TreeNode root) {int result = getHeight(root);return result != (-1);}//高度public int getHeight(TreeNode node){if(node==null){r

平衡二叉树的建立,查找,插入,调整,遍历的C语言实现

/*本程序实现了二叉树的建立,平衡,插入,查找,遍历由于平衡二叉树的删除非常复杂,这里就不做讨论了。*/#include<stdio.h>#include<stdlib.h>#define LH 1#define EH 0#define RH -1typedef struct BinaryTree//定义二叉树的结构{int data;//所要存储的数据struct BinaryTr

二叉树、二叉查找树、平衡二叉树及各种旋转机制

二叉树 大体构型: 树里每个结点存储的有:所有树都是这样 二叉树的度:任意节点度<=2 二叉树的属性: 二叉树的遍历顺序: 前: 中: 后: 二叉查找树:每个节点最多2子节点,最少0子结点。 规则:按照节点数据值确定树中的位置 平衡二叉树:弥补二叉树左右树高度不一样,导致查找效率低 规则: 平衡二叉树的旋转机制:使得树重新保