[Codechef - AASHRAM] Gaithonde Leaves Aashram

Description

给出一棵树,树的“N”节点根植于节点1,每个节点‘u’与权重a[u]相关联。您还可以在树上执行两种类型的查询。查询的数量是‘M’。

  1. 1 U Val:对于类型1的查询,将给出一个节点‘U’和一个整数Val。设子树和=(包括‘U’)的子树中所有节点的权重之和。如果节点‘U’的子树之和为偶数,则将Val添加到‘U’的子树的每个节点(包括节点‘U’),否则将1添加到子树的每个节点(包括节点‘U’)。

  2. 2 U-V:对于类型2的查询,将给出两个节点‘U’和‘V’,并且必须打印‘U’和‘V’的子树和的位XOR。

Solution

DFS序搞一下即可。

SB的我把主程序里DFS用反结果居然过了样例……

#include <bits/stdc++.h>
using namespace std; #define int long long
const int N = 1000005; namespace seg
{
int val[N],tag[N]; void pushup(int p)
{
val[p]=val[p*2]+val[p*2+1];
}
void pushdown(int p,int l,int r)
{
if(tag[p])
{
tag[p*2]+=tag[p];
tag[p*2+1]+=tag[p];
val[p*2]+=tag[p]*((l+r)/2-l+1);
val[p*2+1]+=tag[p]*(r-(l+r)/2);
tag[p]=0;
}
}
void build(int p,int l,int r,int *src)
{
if(l==r)
{
val[p]=src[l];
}
else
{
build(p*2,l,(l+r)/2,src);
build(p*2+1,(l+r)/2+1,r,src);
pushup(p);
}
}
void modify(int p,int l,int r,int ql,int qr,int v)
{
if(l>qr || r<ql)
return;
if(l>=ql && r<=qr)
{
val[p]+=v*(r-l+1);
tag[p]+=v;
}
else
{
pushdown(p,l,r);
modify(p*2,l,(l+r)/2,ql,qr,v);
modify(p*2+1,(l+r)/2+1,r,ql,qr,v);
pushup(p);
}
}
int query(int p,int l,int r,int ql,int qr)
{
if(l>qr || r<ql)
return 0;
if(l>=ql && r<=qr)
return val[p];
else
{
pushdown(p,l,r);
return query(p*2,l,(l+r)/2,ql,qr) + query(p*2+1,(l+r)/2+1,r,ql,qr);
}
}
} namespace tree
{
vector <int> g[N];
int dfn[N],fin[N],vis[N],ind=0,n; void link(int p,int q)
{
g[p].push_back(q);
g[q].push_back(p);
} void dfs(int p)
{
vis[p]=1;
dfn[p]=++ind;
for(int i=0; i<g[p].size(); i++)
{
if(vis[g[p][i]]==0)
{
dfs(g[p][i]);
}
}
fin[p]=ind;
} void presolve()
{
memset(vis,0,sizeof vis);
dfs(1);
} int query(int p)
{
return seg::query(1,1,n,dfn[p],fin[p]);
} void modify(int p,int v)
{
seg::modify(1,1,n,dfn[p],fin[p],v);
}
} int n,m,t1,t2,t3,t4;
int v[N],src[N]; signed main()
{
ios::sync_with_stdio(false);
cin>>n>>m;
for(int i=1; i<=n; i++)
{
cin>>v[i];
}
for(int i=1; i<n; i++)
{
cin>>t1>>t2;
tree::link(t1,t2);
}
tree::presolve();
tree::n=n;
for(int i=1; i<=n; i++)
{
src[tree::dfn[i]]=v[i];
}
seg::build(1,1,n,src);
for(int i=1; i<=m; i++)
{
cin>>t1>>t2>>t3;
if(t1==1)
{
if(tree::query(t2)%2ll)
{
tree::modify(t2,1);
}
else
{
tree::modify(t2,t3);
}
}
else
{
cout<<(tree::query(t2) ^ tree::query(t3))<<endl;
}
}
}

[Codechef - AASHRAM] Gaithonde Leaves Aashram - 线段树,DFS序的更多相关文章

  1. Tsinsen A1505. 树(张闻涛) 倍增LCA,可持久化线段树,DFS序

    题目:http://www.tsinsen.com/A1505 A1505. 树(张闻涛) 时间限制:1.0s   内存限制:512.0MB    总提交次数:196   AC次数:65   平均分: ...

  2. BZOJ_3252_攻略_线段树+dfs序

    BZOJ_3252_攻略_线段树+dfs序 Description 题目简述:树版[k取方格数] 众所周知,桂木桂马是攻略之神,开启攻略之神模式后,他可以同时攻略k部游戏.今天他得到了一款新游戏< ...

  3. 【XSY2534】【BZOJ4817】树点涂色 LCT 倍增 线段树 dfs序

    题目大意 ​ Bob有一棵\(n\)个点的有根树,其中\(1\)号点是根节点.Bob在每个点上涂了颜色,并且每个点上的颜色不同.定义一条路径的权值是:这条路径上的点(包括起点和终点)共有多少种不同的颜 ...

  4. 【bzoj4817】树点涂色 LCT+线段树+dfs序

    Description Bob有一棵n个点的有根树,其中1号点是根节点.Bob在每个点上涂了颜色,并且每个点上的颜色不同.定义一条路 径的权值是:这条路径上的点(包括起点和终点)共有多少种不同的颜色. ...

  5. S - Query on a tree HDU - 3804 线段树+dfs序

    S - Query on a tree HDU - 3804   离散化+权值线段树 题目大意:给你一棵树,让你求这棵树上询问的点到根节点直接最大小于等于val的长度. 这个题目和之前写的那个给你一棵 ...

  6. HDU 5692 线段树+dfs序

    Snacks Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Sub ...

  7. 【BZOJ-3779】重组病毒 LinkCutTree + 线段树 + DFS序

    3779: 重组病毒 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 224  Solved: 95[Submit][Status][Discuss] ...

  8. 【BZOJ-3306】树 线段树 + DFS序

    3306: 树 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 792  Solved: 262[Submit][Status][Discuss] De ...

  9. HDU5692(线段树+dfs序)

    Snacks Time Limit:5000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit Statu ...

随机推荐

  1. Java Web笔记(2)

    学习笔记,狂神说java,链接:https://www.bilibili.com/video/av68833391 5.Maven 我为什么要学习这个技术? 在Javaweb开发中,需要使用大量的ja ...

  2. Linux内核本地提权漏洞(CVE-2019-13272)

    漏洞描述 kernel / ptrace.c中的ptrace_link错误地处理了想要创建ptrace关系的进程的凭据记录,这允许本地用户通过利用父子的某些方案来获取root访问权限 进程关系,父进程 ...

  3. centos7 升级sqlite3

    升级sqlite3 官网 点击 1.下载源码 wget https://www.sqlite.org/2019/sqlite-autoconf-3300100.tar.gz 2.解压,编译 .tar. ...

  4. 安装Jenkins到Ubuntu(APT)

    运行环境 系统版本:Ubuntu 16.04.4 LTS 软件版本:Jenkins-2.176.2 硬件要求:最低内存:256MB.磁盘:1GB 安装过程 1.配置APT-Jenkins存储库 APT ...

  5. 在oracle中使用merge into实现更新和插入数据

    目录 oracle中使用merge into DUAL表解释 使用场景 用法 单表 多表 oracle中使用merge into DUAL表解释 在Oracle数据库中,dual是Oracle中的一个 ...

  6. Hadoop学习之路(9)ZooKeeper安装

    文章目录 1.环境准备 1.1下载zooKeeper 1.3安装zooKeeper 1.4配置zooKeeper环境变量 1.5 修改zookeeper集群配置文件 1.6 创建myid文件 1.7 ...

  7. JavaScript - request封装

    request封装--微信小程序使用async,await ES5 参考代码 var request = function(param){ var _this = this; $.ajax({ typ ...

  8. Electron+React+七牛云 实战跨平台桌面应用(最新更新)

    课程资料获取链接:点击这里 前市场上对 Electron 的呼声很高,它几乎是 Web 开发人员开发桌面客户端的唯一途径,很多大厂都使用 Electron 开发自己的原生应用.Electron 天生适 ...

  9. java - 各类OOM分析

    StackOverflowError 比较常见的问题,虚拟机栈中栈帧过多超出栈容量,常见发生在递归方法深度过深. OutOfMemoryError java heap space java堆内存不足以 ...

  10. 849. Dijkstra求最短路 I(模板)

    给定一个n个点m条边的有向图,图中可能存在重边和自环,所有边权均为正值. 请你求出1号点到n号点的最短距离,如果无法从1号点走到n号点,则输出-1. 输入格式 第一行包含整数n和m. 接下来m行每行包 ...