570D - Tree Requests

深入解析 RLHF(Reinforcement Learning from Human Feedback) 随着人工智能(AI)技术的快速发展,大规模语言模型(如 OpenAI 的 GPT、Anthropic 的 Claude 等)已经能够生成高质量的文本。RLHF 是一种基于强化学习(Reinforcement Learning, RL)的优化方法,它结合人类反馈(Human Feedback)来训练奖励模型(Reward Model, RM),进而优化语言模型的生成策略。整个强化学习的目标是找到最优策略 π∗\pi^*π∗,使得模型在与环境交互的过程中,最大化累积奖励。RLHF 是一种结合强化学习(RL) 阅读详情

Roman planted a tree consisting of n vertices. Each vertex contains a lowercase English letter. Vertex 1 is the root of the tree, each of the n - 1 remaining vertices has a parent in the tree. Vertex is connected with its parent by an edge. The parent of vertex i is vertex pi, the parent index is always less than the index of the vertex (i.e., pi < i).

The depth of the vertex is the number of nodes on the path from the root to v along the edges. In particular, the depth of the root is equal to 1.

We say that vertex u is in the subtree of vertex v, if we can get from u to v, moving from the vertex to the parent. In particular, vertex v is in its subtree.

Roma gives you m queries, the i-th of which consists of two numbers vi, hi. Let’s consider the vertices in the subtree vi located at depth hi. Determine whether you can use the letters written at these vertices to make a string that is a palindrome. The letters that are written in the vertexes, can be rearranged in any order to make a palindrome, but all letters should be used.

Input
The first line contains two integers n, m (1 ≤ n, m ≤ 500 000) — the number of nodes in the tree and queries, respectively.

The following line contains n - 1 integers p2, p3, …, pn — the parents of vertices from the second to the n-th (1 ≤ pi < i).

The next line contains n lowercase English letters, the i-th of these letters is written on vertex i.

Next m lines describe the queries, the i-th line contains two numbers vi, hi (1 ≤ vi, hi ≤ n) — the vertex and the depth that appear in the i-th query.

Output
Print m lines. In the i-th line print “Yes” (without the quotes), if in the i-th query you can make a palindrome from the letters written on the vertices, otherwise print “No” (without the quotes).

Examples
input
6 5
1 1 1 3 3
zacccd
1 1
3 3
4 1
6 1
1 2
output
Yes
No
Yes
Yes
Yes
Note
String s is a palindrome if reads the same from left to right and from right to left. In particular, an empty string is a palindrome.

Clarification for the sample test.

In the first query there exists only a vertex 1 satisfying all the conditions, we can form a palindrome “z”.

In the second query vertices 5 and 6 satisfy condititions, they contain letters “с” and “d” respectively. It is impossible to form a palindrome of them.

In the third query there exist no vertices at depth 1 and in subtree of 4. We may form an empty palindrome.

In the fourth query there exist no vertices in subtree of 6 at depth 1. We may form an empty palindrome.

In the fifth query there vertices 2, 3 and 4 satisfying all conditions above, they contain letters “a”, “c” and “c”. We may form a palindrome “cac”.

题意:让你在以root 为父节点的子树中挑出所有深度为d的点问这些节点上的字母经过任意排列是不是可以形成一个回文。
思路:由于是任意组合,那么只要这个单词数量是偶数就必定可以,如果奇数个数的单词数不超过1个,那么也是可以的。由于是离线查询,所以可以想到用dsu on tree 去统计树上节点的属性,这个属性就是深度为d各个单词的数量。。。我把以u节点的所有深度存下来再去查询错了。。把所有查询先读下来边统计边处理查询再一次输出对了。。。还是玄学。。。

#include<iostream>
#include<algorithm>
#include<vector>
#include<queue>
#include<vector>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<string>
#include<stack>
#include<map>
using namespace std;

//thanks to pyf ...

#define INF 0x3f3f3f3f
#define CLR(x,y) memset(x,y,sizeof(x))
#define mp(x,y) make_pair(x,y)
typedef pair<int, int> PII;
typedef long long ll;

const int N = 500000 + 5;

struct Edge
{
    int u, v, next;
} edge[N * 2];

char cap[N];
int cur_deep_cnt[N];
int cur_deep_dif_cnt[N][30];
int cur_status[N];
int ans[N];
vector<PII>Q[N];
int deep[N];
int clr[N];
int big[N];
int head[N];
int sz[N];
int tot;
int Max_d = 0;
void init()
{
    CLR(cur_deep_cnt, 0);
    CLR(cur_deep_dif_cnt, 0);
    CLR(big, 0);
    CLR(head, -1);
    CLR(sz, 0);
    CLR(clr, 0);
    tot = 0;
    Max_d = 0;
}
void add_edge(int u, int v)
{
    edge[tot].u = u;
    edge[tot].v = v;
    edge[tot].next = head[u] ;
    head[u] = tot ++ ;
}
void get_sz(int u, int fa, int d)
{
    sz[u] = 1;
    deep[u] = d;
    Max_d = max(Max_d, d);
    for (int i = head[u]; i != -1; i = edge[i].next)
    {
        int v = edge[i].v;
        if (v == fa)
            continue;
        get_sz(v, u, d + 1);
        sz[u] += sz[v];
    }
}
// void add(int u, int fa)
// {
//  int val = cap[u] - 'a';
//  cur_deep_cnt[deep[u]] -= cur_deep_dif_cnt[deep[u]][val];
//  cur_deep_dif_cnt[deep[u]][val] ^= 1;
//  cur_deep_cnt[deep[u]] += cur_deep_dif_cnt[deep[u]][val];
//  for (int i = head[u]; i != -1; i = edge[i].next)
//  {
//      int v = edge[i].v;
//      if (fa == v || big[v])
//          continue;
//      add(v, u);
//  }
// }
void add(int u, int fa)
{
    cur_status[deep[u]] ^= (1 << (cap[u] - 'a'));
    for (int i = head[u]; i != -1; i = edge[i].next)
    {
        int v = edge[i].v;
        if (big[v] || v == fa)
            continue;
        add(v, u);
    }
}
void dfs(int u, int fa, bool keep)
{
    int mx = -1, big_son = -1;
    for (int i = head[u]; i != -1; i = edge[i].next)
    {
        int v = edge[i].v;
        if (v == fa)
            continue;
        if (sz[v] > mx)
            mx = sz[v] , big_son = v;
    }
    for (int i = head[u]; i != -1; i = edge[i].next)
    {
        if (edge[i].v != fa && edge[i].v != big_son)
        {
            dfs(edge[i].v, u, 0);
        }
    }
    if (big_son != -1)
        dfs(big_son, u, 1), big[big_son] = 1;
    add(u, fa);
    for (int i = 0; i < Q[u].size(); i++)
    {
        int id = Q[u][i].second;
        int dep = Q[u][i].first;
        //  ans[id] = (cur_deep_cnt[dep] > 1);
        ans[id] = (cur_status[dep] & (cur_status[dep] - 1)) > 1;
    }
    if (big_son != -1)
        big[big_son] = 0;
    if (!keep)
        add(u, fa);
}

int main()
{
    int n, m;
    while (cin >> n >> m)
    {
        init();
        for (int i = 2; i <= n; i++)
        {
            int u;
            scanf("%d", &u);
            add_edge(u, i);
//          add_edge(i, u);
        }
        for (int i = 1; i <= n; i++)
            cin >> cap[i];
        // for (int i = 1; i <= n; i++)
        // {
        //  for (int j = 1; j <= Max_d; j++)
        //  {
        //      cout << ans[i][j - 1] << " ";
        //  }
        //  cout << endl;
        // }
        for (int i = 0; i < m; i++)
        {
            int r, d;
            scanf("%d%d", &r, &d);
            Q[r].push_back(mp(d, i));
        }
        get_sz(1, 1, 1);
        dfs(1, 1, 0);
        for (int i = 0; i < m; i++)
            if (ans[i])
                printf("No\n");
            else
                printf("Yes\n");
    }
}
51单片机——LCD12864驱动函数深度解析与实战优化 本文深入解析了51单片机驱动LCD12864液晶屏的核心驱动函数,从底层时序、关键延时到地址计算进行逐行剖析,并针对常见显示问题提供系统性的调试技巧与实战优化方案。重点探讨了如何将基础代码优化为稳定高效的驱动,涵盖延时精准化、批量写入及显示缓冲区等高级技巧,旨在帮助开发者从“点亮”屏幕进阶到“精通”驱动,确保显示稳定可靠。 阅读详情

相关推荐

Android15 AndroidV冻结和解冻的场景

cgroup 最初由 Google 工程师 Paul Menage 和 Rohit Seth 在 2006 年提出,是一种细粒度资源控制的Linux内核机制。于 2007 年合并到 Linux 内核主线中。然而 Google 原生系统直到 Android 11 或更高版本上才支持 CACHE 应用的 CPU 冻结功能。当应用切换到后台并且没有其他活动时,系统会在一定时间内通过状态判断,将进程 ID 迁移到冻结的 cgroup 节点上,实现冻结 CACHE 应用。

苏法迪的专栏 1786

Tree Requests 【CodeForces - 570D】【Dsu on Tree】

题目链接 一棵以1为根的树,每个节点上都有1个字母,有m个询问。每次询问v对应的子树中,深度为h的这层节点的字母,能否打乱重排组成回文串。根的深度为1,每个点的深度为到根(1)的距离。 由于在这里有Q次询问的话,并且又是对子树的询问操作,很容易让人不经意之间的往Dsu on Tree上去想。然后我们可以维护个used[maxN][26],代表的是每一种字符是否是奇数个,如果是奇数个的话...

既然弱小,就只顾变强就是了 273

Ubutntu下使用realsense d435i(二):获取某二维像素点的三维坐标

00 准备工作 准备工作包括安装驱动以及pyrealsense2,具体可参考上一篇: Ubutntu下使用realsense d435i(一):准备工作以及安装pyrealsense2 https://blog.youkuaiyun.com/gyxx1998/article/details/121461293 01 通过二维像素点获得物体三维坐标 这个在上一篇已经介绍了代码: realsense d435i获取某像素点三维坐标(计算深度和点云两种方法) https://blog.youkuaiyun.com/gyxx1998/

gyxx1998的博客 9943

洛谷-Tree Requests-(树上启发式合并+维护深度和字母)

DIV2-D 题意: 就是给你一个树,然后每个节点有一个字母,给你m次查询,每次问你以a为根的子树里面深度为b的所有节点的字母重新排列后能否组成一个回文串。 思考: 很明显了,离线处理子树问题,对于重新排列后能否形成一个回文串,意思就是对于每个字母看看出现的次数为奇数的有几个,最多1个,要不然就组成不了。所以这个里面维护cnt[i][j]代表深度为i字母为j出现的次数。这个就是维护cnt数组就行了,也用不到别的全局变量之类的。 代码: int T,n,m,k; int va[N]; int dep[N],s

m0_52398496的博客 325

PaddleOCR实战指南:从环境搭建到自定义模型训练

本文提供了PaddleOCR从环境搭建到自定义模型训练的完整实战指南。详细介绍了使用Anaconda或Docker搭建稳定开发环境、准备与标注数据集、进行文本检测与识别模型训练的核心步骤与参数调优技巧,并分享了数据增强、模型微调及解决实际项目难题的实用方法,帮助开发者高效掌握PaddleOCR应用。

gold的博客 642

从安装到跑通第一个例程:Halcon 20.11深度学习版环境搭建全记录

本文详细记录了Halcon 20.11深度学习版环境搭建的全过程,从安装配置到运行第一个例程,特别针对CUDA版本冲突、算子验证和样本数据预处理等常见问题提供解决方案。通过实战案例展示PCB缺陷分类流程,帮助工程师快速掌握工业级图像处理技术,提升深度学习模型在工业质检中的应用效率。

weixin_28739079的博客 221

DSU ON TREE:Tree Requests

题目链接:https://codeforces.com/contest/570/problem/D 分析: 1.按照题意,某个节点作为根节点的子树,其对应深度的节点进行随机排列能够组成一个回文串,要满足这个条件需要什么? 情况1(1):此串中相同字符出现次数都是偶数次。(aabb) 情况2(2):此串中最多只有一个字符出现的次数为奇数。 2.既然知道了第一个知识,那么我们就可以知道想要求 是否满足,就要对其对应深度的节点值进行次数统计。 3.首先看暴力求法,将所有节点作为根节点去遍历其

qq_49120553的博客 335

ORB-SLAM2算法4之KITTI开源数据集运行ORB-SLAM2生成轨迹并用evo工具评估轨迹

ORB-SLAM2算法1 已成功编译安装ORB-SLAM2到本地,本篇目的是用KITTI开源数据来运行ORB-SLAM2,并生成轨迹,最后用evo评估工具来评估ORB-SLAM2生成的轨迹和真值轨迹。

重点记录机器人和自动驾驶相关领域的技术,尤其是计算机视觉,视觉SLAM等,不仅有前言文献或必备算法的学习,也会有实际应用的点滴经验 2326

Tree Requests

Roman planted a tree consisting of n vertices. Each vertex contains a lowercase English letter. Vertex 1 is the root of the tree, each of the n − 1n - 1n − 1 remaining vertices has a parent in the tree. Vertex is connected with its parent by an edge. The p

sky123博客 454

使用 IMDb API 获取电影评分和评论的 Python 爬虫

电影是人们娱乐生活中的重要组成部分,随着电影产业的快速发展,观众对电影的评价也越来越多样化。IMDb(互联网电影数据库)作为全球最大的电影评分和评论平台之一,收录了成千上万部电影、电视节目及其相关数据。它提供了一个强大的 API 接口,允许开发者访问电影的评分、评论、演员信息等数据。本文将带你一步一步实现一个 Python 爬虫,使用 IMDb API 获取电影的评分和评论。我们将通过这个爬虫来分析一些热门电影的观众反馈,并可视化分析结果。

2201_76125261的博客 1055

置顶必读(2) |《滚雪球学数学建模》专栏目录 & 历年国赛/美赛真题库 & 真题解析(持续更新中)

本专栏《滚雪球学数学建模》采用“从零开始、逐步滚雪球”的学习路径,把数学建模的基础理论、方法工具与大量实战真题(尤其是国赛题,涵盖2025-1992所有真题)有机融合,形成一套系统化训练路线。非常适合零基础入门、希望提升模型与工程化能力的本科/研究生,以及备战全国大学生数学建模竞赛(国赛/省赛)的同学。加油,我们一起把建模能力打造成可迁移的核心竞争力!

**My Coding Family** 26万+

cf570 D. Tree Requests

cf570 D. Tree Requests 题意: 给定一个以 1 为根的 n 个结点的树,每个点上有一个字母(a-z)。每次询问 a, b 查询以 a 为根的子树内深度为 b 的结点上的字母重新排列之后是否能构成回文串。 题解: 回文串形成条件? 如果回文串是偶数个,那就要求每个字符都是出现偶数次 如果回文串是奇数个,那么说明只有一个字符是奇数次,其他都是偶数次 总结:最后只能有一个字符出现奇数次 现在我们开始统计一个子树内的各字符出现次数,可以用树上启发式合并来做,因为有q组询问,对于每组询问我们存下

qq_35975367的博客 487

7、PPG信号处理与质量评估

本文详细介绍了PPG信号的处理与质量评估方法,包括信号滤波技术(如卷积和互相关)、滤波器选择、信号质量指标(SQI)的定义与应用,以及标注一致性的评估。同时,提供了MATLAB代码示例和操作步骤,并分析了不同指标的优势与适用场景,旨在提高PPG信号在诊断和监测中的准确性与可靠性。

salt的博客 254

CF570D Tree Requests

传送门。

peter_code的博客 653

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

【CodeForces - 570D】:Tree Requests【dsu on tree】

题目: CodeForces - 570D:Tree Requests 题意: 给定一棵树,每个节点有一个字母,给出 m 次询问,每次询问能否将以 v 为根的子树中深度为 h 的节点上的字母任意拼接成一个回文串 分析: 容易得出字母数量为奇数的不同字母的个数 <= 1 时,答案为 yes,否则为 no (1)首先可以按深度对节点分成不同的块,再跑一遍 dfs 序,那么子树就对应一...

KobeDuu 309

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

codeforces570D Tree Requests

题目链接:codeforces570D 正解:$dsu$ $on$ $tree$ 解题报告:   考虑这又是一类子树内的不带修改统计问题,直接上$dsu$ $on$ $tree$好咯。   直接按上一道题的做法做,类似地存一下每个深度每种字符的出现次数,对于每个点的询问,在每个点处查询一下就好了,只需奇数的个数$<=1$即可。 //It is mad...

dgoh41514的博客 202

Codeforces 570D Tree Requests

D. Tree Requests time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output Roman planted a tree consisting of n verti

弱者要战斗 1290

Tree Requests [CodeForces - 570D]

传送门 dsu on tree 的经典题 能组成回文串的前提是至多有一种字符是奇数个,统计同一深度下各种字符个数即可。启发式合并即可优雅的暴力统计。 ps:一直wa41,也找不到错误,看了样例才发现输入中多了一个空行,我是单个字符读入的。 又发现一个新的wa题方法。。。 #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<vector>

qq_45288870的博客 271

CodeForces 570D Tree Requests

CodeForces 570D Tree Requests

汤键的博客 299

【CF 570D】Tree Requests

【CF 570D】Tree Requests树节点标号递增 规定父亲标号<儿子 dfs重标号 同时用一个数组存该节点为根的树的最小节点 一个数组存该节点为树根的最大节点 一个数组存对应深度存在的节点 再来一个数组存每一位置累计字符(26个字符 由于偶数次可压缩 故用异或即可) 每查询一个节点和他对应的深度 只需在该深度查该节点为根的最小和最大节点 然后用左右节点字符累计数互相异或 最后看它二进

ACMer' 1087

cf570D Tree Requests

给一颗有根树,每个节点有一个字母,给m次询问,每次询问在i节点的子树下离根节点距离为d的所有节点的字母是否可以组合为回文串。 特别的,如果i节点下没有深度为d的节点都输出Yes。 我们统计每个节点下的子树所有深度的字母。用一个数组表示每个深度的26种字母。每次询问遍历26种字母如果总字母是奇数个且有两种及以上字母是出现了奇数次就肯定不能组合为回文串,偶数个字母必须都出现偶数次。...

ad4627的博客 160

Codeforces 570D Tree Requests

Codeforces 570D Tree Requestsdsu on tree题意给一棵树,每个节点有一个字母。一些查询Q(x,d),查询x及其子树中,与根节点距离为d的所有字母是否可以构成回文串。思路两种思路,dfs序+树状数组或dsu on tree。dfs序+树状数组 我们可以跑一遍dfs序,这样子树在dfs序中连续。dfs时同时处理出距根所有距离的节点。然后离线询问,按深度排序,开26个

P.H.S 412

codeforces 570 D Tree Requests

题意:给出一棵树,每个结点都有一个字母,有很多次询问,每次询问,以结点v为根的子树中高度为h的后代是否能够经过调整变成一个回文串。 做法: 判断是否可以构成一个回文串的话,只需要知道是否有大于一个的奇数数目的字母即可。为了很快的访问到一个区间,记录前缀和即可,为了省内存,状压奇偶即可。 为了很快的找到以结点v为根的子树中高度为h的后代,需要dfs整棵树,然后记录每个结点第一次

Last Order 1017

[CF570D]Tree Requests

Codeforces 数据结构

YveH 736

【cf 570d】Tree Requests

【cf 570d】Tree Requests

pbihao的博客 430
上一篇: Codeforces455C. Civilization
下一篇: Codeforces811C. Vladik and Memorable Trip
OneDay_pyf
博客等级 码龄10年 6粉丝 35原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值