首页 > 其他分享 >Codeforces Round 316 (Div. 2) D题 Tree Requests(二分,dfs,在线,前缀异或)

Codeforces Round 316 (Div. 2) D题 Tree Requests(二分,dfs,在线,前缀异或)

时间:2024-10-07 21:49:04浏览次数:8  
标签:XOR tim int Tree 316 dfs cin dep ans

题目链接

Codeforces Round 316 (Div. 2) D题 Tree Requests

思路

将 26 26 26个字母全部当作一个二进制数。

将每个深度的结点按照dfs序放到一个vector里,同时记录每个vector对应的前缀异或。

对于每一个询问x,只需在给定深度里找到 ≥ \ge ≥L[x]和 ≤ \le ≤R[x]的两个端点,取区间异或和即可。

代码

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 5e5 + 5;
int n, m;
int depth[N], L[N], R[N], ID[N], tim;
char s[N];
vector<int>mp[N], XOR[N], dep[N];
int lowbit(int x) {return (x) & (-x);}
void dfs(int u, int deep)
{
	tim++;
	depth[u] = deep;
	L[u] = tim;
	ID[tim] = u;
	dep[deep].push_back(L[u]);
	for (int j : mp[u])
	{
		dfs(j, deep + 1);
	}
	R[u] = tim;
}
void solve()
{
	cin >> n >> m;
	for (int i = 2, p; i <= n; i++)
	{
		cin >> p;
		mp[p].push_back(i);
	}
	for (int i = 1; i <= n; i++)
	{
		cin >> s[i];
	}
	dfs(1, 1);
	int maxdeep = *max_element(depth + 1, depth + 1 + n);
	for (int i = 1; i <= maxdeep; i++)
	{
		XOR[i].push_back(1ll << (s[ID[dep[i][0]]] - 'a'));
		for (int j = 1; j < dep[i].size(); j++)
		{
			XOR[i].push_back(XOR[i][j - 1] ^ (1ll << (s[ID[dep[i][j]]] - 'a')));
		}
	}

	while (m--)
	{
		int x, d, ans = 0;
		cin >> x >> d;
		int l = lower_bound(dep[d].begin(), dep[d].end(), L[x]) - dep[d].begin();
		int r = upper_bound(dep[d].begin(), dep[d].end(), R[x]) - dep[d].begin();
		r--;
		if (r < 0)
		{
			cout << "Yes" << endl;
		}
		else
		{
			if (l == 0) ans = XOR[d][r];
			else ans = XOR[d][l - 1] ^ XOR[d][r];
			if (ans == lowbit(ans))
			{
				cout << "Yes" << endl;
			}
			else cout << "No" << endl;
		}
	}
}
signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(0), cout.tie(0);
	int test = 1;
	// cin >> test;
	for (int i = 1; i <= test; i++)
	{
		solve();
	}
	return 0;
}

标签:XOR,tim,int,Tree,316,dfs,cin,dep,ans
From: https://blog.csdn.net/weixin_74754298/article/details/142747250

相关文章

  • 2024-2025-1 20241316 《计算机基础与程序设计》第二周学习总结
    2024-2025-120241316《计算机基础与程序设计》第二周学习总结作业信息这个作业属于哪个课程2024-2025-1-计算机基础与程序设计这个作业要求在哪里2024-2025-1计算机基础与程序设计第二周作业这个作业的目标*自学教材计算机科学概论(第七版)第1章并完成云班课测试*......
  • jsp测试缺陷管理系统3166o程序+源码+数据库+调试部署+开发环
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容一、研究背景随着软件行业的迅速发展,软件质量成为企业竞争力的关键因素。在软件开发过程中,测试缺陷管理系统是确保软件质量的重要环节。传统的缺陷......
  • Rebuild Tree
    考虑\(\prods[i]\)的组合意义:就是在每个连通块内选一个点的方案数应用链式前向星存图时,应当舍弃“0-1”变换,从2号边开始编号【对于其他情况,也应尽量避免从0开始编号】枚举子树大小DP是O(n^2)的,但如果有m的限制,可以证明时间复杂度降至O(nm)因为出点和入点未必相同,所以不能简单......
  • 题解:TopCoder12316 ThreeColorability
    Vjudge可以出成《三色绘恋》背景。题意给一个格点数为\((n+1)\times(m+1)\)的网格,给格点染色,相邻的格点不能染成同样的颜色。每个格子有一条对角线的边,可选N形和Z形。现在有一个残缺的网格,存在一些格子的对角线连法不确定,构造一种字典序最小的方案使得至少存在一种染色......
  • Solution - Atcoder ARC157E XXYX Binary Tree
    考虑这个不存在\(\texttt{YY}\)的限制,与\(\texttt{XX}\)个数为变量的限制相比较,看起来\(\texttt{Y}\)就更特殊,于是考虑从\(\texttt{Y}\)的视角来分析问题。同时考虑到因为有\(A+B+C=n-1\),所以\(\texttt{XX}\)其实也不是很重要,因为只需要让\(\texttt{XY}\)和......
  • CF280C Game on Tree题解
    题目描述给定一棵有根树,结点编号从1到n。根结点为1号结点。对于每一次操作,等概率的选择一个尚未被删去的结点并将它及其子树全部删去。当所有结点被删除之后游戏结束。也就是说,删除1号结点后游戏即结束。要求求出删除所有结点的期望操作次数。不是哥们,我好不容易国庆......
  • 力扣(leetcode)每日一题 1845 座位预约管理系统| treeSet和priority Queue的区别|线段树
    之前发过一篇,感觉还有深挖的地方,于是又补充一些信息这题目虽然是middle难度题目,要解答出来是只要easy的时间,但是深挖可以有hard的难度题解1可以帮助复习线段树的使用,题解2可以复习一下java基础知识题解1线段树这是自己憋出来的线段树classSeatManager{......
  • 基于zookeeper安装部署下,配置 HDFS-HA 集群
    一、目录准备:1.在erport目录下创建一个ha文件夹cd/erportmkdirha将/erport/servers/下的hadoop拷贝到/erport/ha目录下:直接移动(本教程所采用):mv/erport/servers/hadoop/erport/hacd/erport/halscd/erport/ha/hadoop/etc/hadoopcphadoop-env.shhadoop......
  • 基于zookeeper安装部署下,配置 HDFS-HA 自动故障转移
    (1)访问 hdfs-site.xml:vi/erport/ha/hadoop/etc/hadoop/hdfs-site.xml在hdfs-site.xml中增加:<!--开启失败故障自动转移--><property><name>dfs.ha.automatic-failover.enabled</name><value>true</value></propert......
  • codeforces round 975 E(div.2)(lambda表达式实现dfs,min_element函数,一定要优化重复的
    解题历程:看到题目要求要用最少的消除次数让所有叶子深度相同,通过观察,那么就只需要将所有深度都尝试一遍就行了,可是我当时没多想就用dfs记录所有节点的深度,单独将所有叶子和该叶子的深度存起来,记录最大的深度,从最大深度尝试到深度0,对于深度小于当前尝试深度的叶子,用dfs的方式将与......