Paint it really, really dark gray CodeForces - 717E

Paint it really, really dark gray

CodeForces - 717E

题意 有一棵树 每个结点是粉色或黑色 每经过一个结点 就改变他的颜色

从1开始遍历 打印出一条路径 让所有结点都变成黑色

思路就是 每到达一个结点 就改变它的颜色 打印这个结点

然后看它的叶子结点

如果没有叶子结点 自然就返回了

有叶子结点的话 那么递归遍历 把子树里面的颜色都变成黑

返回的时候 如果该叶子节点是粉色 就可以再一次访问该叶子节点 再返回

其实这是很浪费时间的 但是题目说只要打印出来的路径符合就好 我们自己看一棵树很容易看出子树里面存不存在粉色

但是程序就得递归遍历全看一遍了 或者可以预处理dfs一遍 再输出完美答案dfs一遍

但是好像更浪费时间hhh(我在说什么

还有一个细节 因为递归处理都是先改变这个结点的颜色 再去访问叶子节点 但是刚开始从1出发是不会改变1的颜色的

就得特判一下 如果全部处理完之后 1是黑色 那么原来就是粉色 就可以访问叶子 访问自己 再访问叶子 就可以了

代码如下

#include <cstdio>
#include <vector>
#include <cstring>
#include <algorithm>
using namespace std;

const int maxn = 2e5 + 10;
vector<int> G[maxn];
int color[maxn];
int ans[maxn];
int cnt;

inline void fun(int u) { color[u] ^= 1; printf("%d ", u); }
void dfs(int u, int fa) {
    fun(u);
    for (int i = 0; i < G[u].size(); i++) {
        int v = G[u][i];
        if (v == fa) continue;
        dfs(v, u);
        fun(u);
        if (color[v]) fun(v), fun(u);
    }
    if (u == 1 && !color[u]) fun(G[u][0]), fun(u), fun(G[u][0]);
}

int main() {
    int n;
    scanf("%d", &n);
    for (int i = 1, x; i <= n; i++) {
        scanf("%d", &x);
        if (x == -1) color[i] = 1;
        else color[i] = 0;
    }
    for (int i = 1, x, y; i < n; i++) {
        scanf("%d%d", &x, &y);
        G[x].push_back(y);
        G[y].push_back(x);
    }
    dfs(1, 0);
    puts("");
    return 0;
}

原文地址:https://www.cnblogs.com/Mrzdtz220/p/10513989.html

时间: 2024-10-06 07:11:15

Paint it really, really dark gray CodeForces - 717E的相关文章

codeforces717E Paint it really, really dark gray(树上dfs)

题意: 给你一棵树,2e5个节点,每个节点有一种颜色(黑色或粉色) 让你从节点1开始,自由沿边行走,到达节点时会把这个节点的颜色改变 要求你输出任意一条路径使得从节点1出发,所有节点的颜色都变为黑色 思路: 很明显要递归遍历 每到达一个节点就先改变节点的颜色标志并输出当前节点 如果当前到达了叶子节点,则不用进行操作 返回上层节点时再改变节点的颜色标志并输出当前节点,然后判断叶子节点的颜色,如果为粉色,则再到达一次叶子节点再回到当前节点 这样确保当前节点的所有儿子节点都为黑色的 然后就这样一直递归

Android 画个电池出来(Paint和canvas)

1.Android中很多时候都要自己去画一个自定义控件出来,就需要用到Paint和Canvas这两个类. 2.效果图: 3.直接上代码: 1 public class BatteryView extends View { 2 3 private Paint mBatteryPait; 4 private Paint mPowerPaint; 5 private float mBatteryStroke = 2.0f; 6 7 /** 8 * 屏幕的高宽 9 * 10 * @param conte

ansible学习一(安装)

Ansible是一种集成系统的配置管理工具,使用Ansible可以批量管理服务器,应用的部署,批量的执行命令,并且Ansible还是一款轻量的开源软件,Ansible部署简单,使用yum包就可安装,但是功能的确相当的丰富,所以今天特地来聊聊Ansible.Ansible还有一个特点就是无需安装agent,使用ssh认证就可以远程控制服务器,这也是我喜欢他的一个原因,如果你python够牛的话,还可以自己定制模块,并且还有api接口,许多自动化运维平台都是调用他的.首先,先看一下安装过程: 系统:

关于ArcGIS API for JavaScript中basemap的总结介绍(一)

实际上basemap这个概念并不只在arcgis中才有,在Python中有一个matplotlib basemap toolkit(https://pypi.python.org/pypi/basemap),是用来实现地理信息可视化的.其中,matplotlib是Python常用的数据绘制包,basemap是matplotlib的一个子包,用来进行地图绘制.本文所指的basemap是指esri提供的基础底图图层. 正式使用basemap是在前一阵做webgis开发的时候,需要在自己的矢量图层下面

android 多点触控

多点触控 1.多点触控从字面意思讲就是你用大于等于2根的手指触摸子啊手机屏幕上. Android中监听触摸事件是onTouchEvent方法,它的参数为MotionEvent,下面列举MotionEvent的一些常用的方法: getPointerCount() 获得触屏的点数. getPointerId(int pointerIndex) 返回一个触摸点的标示,pointIndex是你第几个触控点的索引 getX() 获得触屏的X坐标值 getY() 获得触屏的Y坐标值 getAction()

How to change the output color of echo in Linux

大纲 1.The Bash Shell 2.Output in Color 3.How can do it? 1.The Bash Shell Bash is the primary shell of the Linux machine, included here are some tips/tricks with the shell. Use the manual page and learn about PS1, PS2 and PROMPT_COMMAND. The tricks in

Boottarp学习(三)表单

基础表单 表单主要功能是用来与用户做交流的一个网页控件,良好的表单设计能够让网页与用户更好的沟通.表单中常见的元素主要包括:文本输入框.下拉选择框.单选按钮.复选按钮.文本域和按钮等.其中每个控件所起的作用都各不相同,而且不同的浏览器对表单控件渲染的风格都各有不同. 同样,表单也是Bootstrap框架中的核心内容,下面向大家介绍Bootstrap框架中表单的制作. 表单源码查询 Bootstrap框架的表单,其源码占据了大量的代码,同样的,根据不同的Bootstrap版本,你可以轻松获取相应的

Bootstrap学习笔记(二) 表单

在Bootstrap学习笔记(一) 排版的基础上继续学习Bootstrap的表单,编辑器及head内代码不变. 3-1 基础表单 单中常见的元素主要包括:文本输入框.下拉选择框.单选按钮.复选按钮.文本域和按钮等. 在Bootstrap框架中,通过定制了一个类名`form-control`,也就是说,如果这几个元素使用了类名"form-control",将会实现一些设计上的定制效果. 1.宽度变成了100% 2.设置了一个浅灰色(#ccc)的边框 3.具有4px的圆角 4.设置阴影效果

C++入门

  C++入门必看,提升必看 Visual C++MFC入门教程 目录 +-- 第一章 VC入门|------ 1.1 如何学好VC|------ 1.2 理解Windows消息机制|------ 1.3 利用Visual C++/MFC开发Windows程序的优势|------ 1.4 利用MFC进行开发的通用方法介绍|------ 1.5 MFC中常用类,宏,函数介绍+-- 第二章 图形输出|------ 2.1 和GUI有关的各种对象|------ 2.2 在窗口中输出文字|------