首页 > 其他分享 >Codeforces Round #316 (Div. 2) D. Tree Requests (DFS序)

Codeforces Round #316 (Div. 2) D. Tree Requests (DFS序)

时间:2023-04-13 22:34:48浏览次数:49  
标签:cnt const int Tree 316 DFS MAXN include head


题目地址:http://codeforces.com/contest/570/problem/D
比赛的时候实在没想到DFS序,。。想到DFS序后,分别存起每个深度的所有节点的DFS序,处理出前缀异或和,然后二分找到两个端点,再异或一下,就求出了所求区间的异或和,由于偶数次的都被异或掉了,所以判断下奇数次数是否大于1即可。
代码如下:

#include <iostream>
#include <string.h>
#include <math.h>
#include <queue>
#include <algorithm>
#include <stdlib.h>
#include <map>
#include <set>
#include <stdio.h>
#include <time.h>
using namespace std;
#define LL long long
#define pi acos(-1.0)
#pragma comment(linker, "/STACK:1024000000")
const LL mod=3221225473;
const int INF=0x3f3f3f3f;
const double eqs=1e-9;
const int MAXN=500000+10;
vector<int>vec[MAXN];
vector<int>::iterator it;
int in[MAXN], out[MAXN], sum[MAXN];
int head[MAXN], cnt, now;
char s[MAXN];
struct node
{
        int u, v, next;
}edge[MAXN];
void add(int u, int v)
{
        edge[cnt].v=v;
        edge[cnt].next=head[u];
        head[u]=cnt++;
}
void init(int n)
{
        memset(head,-1,sizeof(head));
        cnt=now=0;
        memset(sum,0,sizeof(sum));
        for(int i=1;i<=n;i++){
                vec[i].clear();
                vec[i].push_back(0);
        }
}
void dfs(int u, int h)
{
        now++;
        sum[now]=sum[*(--vec[h].end())]^(1<<s[u]-'a');
        vec[h].push_back(now);
        in[u]=now;
        for(int i=head[u];i!=-1;i=edge[i].next){
                int v=edge[i].v;
                dfs(v,h+1);
        }
        out[u]=now;
}
int main()
{
        int n, m, i, j, u, h, ans, l, r, flag;
        while(scanf("%d%d",&n,&m)!=EOF){
                init(n);
                for(i=2;i<=n;i++){
                        scanf("%d",&u);
                        add(u,i);
                }
                scanf("%s",s+1);
                dfs(1,1);
                while(m--){
                        scanf("%d%d",&u,&h);
                        it=lower_bound(vec[h].begin(),vec[h].end(),out[u]);
                        if((*it)!=out[u]) it--;
                        r=sum[*it];
                        it=--lower_bound(vec[h].begin(),vec[h].end(),in[u]);
                        l=sum[*it];
                        ans=r^l;
                        flag=0;
                        for(i=0;i<26;i++){
                                if(ans&(1<<i)) flag++;
                                if(flag==2) break;
                        }
                        if(flag==2) puts("No");
                        else puts("Yes");
                }
        }
        return 0;
}


标签:cnt,const,int,Tree,316,DFS,MAXN,include,head
From: https://blog.51cto.com/u_16070138/6188461

相关文章

  • HDU 4812 D Tree (树上点分治)
    题目地址:HDU4812这题是13年南京区域赛的现场题。树分治思想。树分治的过程中记录下每个子树的所有到达根的路径的积,用best记录下每个积的最小端点,然后再枚举当前子树的每个积,然后用逆元的方法求出当积为k时所需要的另一个端点值,并更新答案。代码如下:#include<iostream>#......
  • SPOJ 375 QTREE系列-Query on a tree (树链剖分)
    题目地址:SPOJ375树链剖分第一发!果然是个貌似很高级的数据结构,其实就是把树的边从树形结构转化成了线性结构,从而可以用线段树或树状数组之类的数据结构进行快速维护。从而将时间缩到n*log(2*n).这题用的线段树维护的。代码如下:#include<iostream>#include<string.h......
  • POJ 3237 Tree (树链剖分)
    题目地址:POJ3237这题用了一下午。。本来一直认为max和min两个数组是不用改的,只需要改lazy数组,然后在查询的时候利用lazy标记来返回max或-min,后来发现错的很严重。。这题要在pushdown中修改max和min数组,从而实现最大值取反。代码如下:#include<iostream>#include<strin......
  • Element Plus Tree 树 回显
     <el-form-itemlabel="菜单权限">       <el-tree:data="navList"ref="treeRef"  node-key="menuId"highlight-current=“true”:props="defaultProps" @check="checked" show-checkboxcl......
  • TreeMap源码
          常见面试题:    ......
  • 自己动手,通过源码找回 Ant-Design-Blaozr 中 Tree 组件的搜索筛选效果
    最近更新一个Blazorserver的项目,顺带把用到的Ant-Design-Blazor升级到了最新的0.14.4,结果发现之前在0.8.4版本中Tree组件的搜索显示效果变了,从仅显示找到的节点变成了在全部节点中高亮显示匹配的结果,为了节省用户沟通成本(就是懒得跟最终用户费口舌解释),于是自己动手把这个......
  • dfn序,dfs序与欧拉序的区别
    dfn序,dfs序与欧拉序的区别dfs序是dfs过程中对于某节点进入这个节点的子树和离开子树的顺序满足每个节点都会在dfs序上出现恰好两次任意子树的dfs序都是连续的欧拉序是dfs过程中经过节点的顺序每个节点至少出现一次(事实上出现这个节点的度次,根节点额外一次)有时候用来配合稀疏......
  • 解密!FastDFS的安装及部署(实战篇)
    前言天猫、淘宝等购物网站,海量的商品图片和视频,是如何存储的?当用户访问量大时,又如何保证下载速度?分布式文件系统就是用来解决这些问题的。那么分布式文件系统该如何使用呢?别急,今天袁老师就会带领大家来学习这些非常实用的技能:分布式文件系统概述主流的分布式文件系统的介绍重点介绍......
  • TreeMap
        ......
  • UVa 112 Tree Summing (scanf()去空格&递归&二叉树遍历)
    112-TreeSummingTimelimit:3.000secondshttp://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=48BackgroundLISPwasoneoftheearliesthigh-levelprogramminglanguagesand,withFORTRAN,isoneoft......