[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;
}
}
}

最新文章

  1. UWP VirtualizedVariableSizedGridView 支持可虚拟化可变大小Item的View(二)
  2. 中小公司PMO不一样期间的责任
  3. linux编程之内存映射
  4. android 入门-android属性介绍
  5. Android去除CPU占用过高时屏幕四周闪红框
  6. HDU 5874 Friends and Enemies 【构造】 (2016 ACM/ICPC Asia Regional Dalian Online)
  7. troubleshooting ORA-600[6302] &amp; ORA-600 [6200] corrupted index block
  8. CAS学习笔记(三)—— SERVER登录后用户信息的返回
  9. meta 标签整理
  10. 根据输出设置select的被选中值
  11. Android创建启动画面
  12. scala读取解析json文件
  13. C# DataGridView下DataGridViewComboBoxColumn二级联动
  14. LeetCode 键盘行-Python3.7&lt;四&gt;
  15. windows server 2008额外域控提升为主域控
  16. c++中ifstream一次读取整个文件
  17. cancel_delayed_work和flush_scheduled_work【转】
  18. 图的基本操作(基于邻接表):图的构造,深搜(DFS),广搜(BFS)
  19. Python 编程核心知识体系-模块|面向对象编程(三)
  20. burpsuite 抓取https 证书问题

热门文章

  1. cf1176D
  2. 论文阅读笔记(十七)【ICCV2017】:Dynamic Label Graph Matching for Unsupervised Video Re-Identification
  3. 一、JVM之类加载器
  4. MVC开发之注入容器Ninject的使用
  5. 【spring boot】SpringBoot初学(2.2)&ndash; SpEL表达式读取properties属性到Java对象
  6. 基于STL的字典生成模块-模拟搜索引擎算法的尝试
  7. Selenium实战(二)——调用JavaScript之execute_script()方法
  8. layui的跳转链接实现分页low
  9. Bootstrap 警告框(Alert)插件
  10. 爬虫学习笔记2requests库和beautifulsoup4库学习笔记