Codeforces Round #442 (Div. 2) 877E - Danil and a Part-time Job

emmmm第一次见的东西感觉都好神奇

这里dfs序可以通过对树的遍历对各个节点进行区间分配,那么在接下来的线段树中,可以转变为对每个节点所对应的子树进行访问

一开始感觉有些混乱,emmmm,理解上有困难的话……emmm,其实线段树维护的是区间,

而dfs序只是根据题意对节点(线段树的叶子?不要去管它的父亲或者线段树数组内部的结构)管辖区间的建立,因为题目中要求访问以*为根的子树的情况,在用到线段树时,

需要提供区间的左右端点,也就是dfs序所建立的L[*],R[*],只需要将主函数中访问线段树时的区间[L,R]换为【L[*],R[*]】就可以了……

emmmm好像说了一堆废话orz

#include<iostream>
#include<stdio.h>
#include<string>
#include<vector>
using namespace std;
const int N = 2e5 + 5;
vector<int>g[N];
int L[N], R[N];
int cnt=0, n, T;
struct tree {int l, r, add, c[2];
}t[N << 2];
void init()
{for (int i = 0; i < N; i++)g[i].clear();cnt = 0;
}
void dfs(int u, int fa)
{L[u] = ++cnt;for (auto v : g[u]){if (v != fa)dfs(v, u);}R[u] = cnt;
}
void push_up(int rt)
{for (int i = 0; i < 2; i++)t[rt].c[i] = t[rt << 1].c[i] + t[rt << 1 | 1].c[i];
}
void push_down(int rt)
{if (t[rt].add){swap(t[rt << 1].c[0], t[rt << 1].c[1]);swap(t[rt << 1 | 1].c[0], t[rt << 1 | 1].c[1]);t[rt << 1].add ^= 1;t[rt << 1 | 1].add ^= 1;t[rt].add = 0;}
}
void build(int l, int r, int rt)
{t[rt].l = l; t[rt].r = r;t[rt].add = 0;if (l == r){t[rt].c[0] = 1;t[rt].c[1] = 0;return;}int mid = (l + r) >> 1;build(l, mid, rt << 1);build(mid + 1, r, rt << 1 | 1);push_up(rt);
}
void update(int l, int r, int rt)
{if (t[rt].l == l&&t[rt].r == r){t[rt].add ^= 1;swap(t[rt].c[0], t[rt].c[1]);return;}int mid = (t[rt].l + t[rt].r) >> 1;push_down(rt);if (r <= mid)update(l, r, rt << 1);else if (l > mid)update(l, r, rt << 1 | 1);elseupdate(l, mid, rt << 1),update(mid+1, r, rt << 1 | 1);push_up(rt);
}
int query(int l, int r, int rt)
{if (t[rt].r == r&&t[rt].l == l)return t[rt].c[1];int mid = (t[rt].l + t[rt].r) >> 1;push_down(rt);if (r <= mid)return query(l, r, rt << 1);else if (l > mid)return query(l, r, rt << 1 | 1);elsereturn query(l, mid, rt << 1) + query(mid+1,r, rt << 1 | 1);
}
int main()
{init();cin >> n;for (int i = 2; i <= n; i++){cin >> T;g[T].push_back(i);}dfs(1, 1);build(1, cnt, 1);for (int i = 1; i <= n; i++){int m;cin >> m;if (m)update(L[i], L[i], 1);}cin >> T;string s;for (int i = 0; i < T; i++){int m;cin >> s >> m;if (s[0] == 'g')cout << query(L[m], R[m], 1) << endl;else update(L[m], R[m], 1);}return 0;
}

转载于:https://www.cnblogs.com/Egoist-/p/7747842.html

Codeforces Round #442 (Div. 2) 877E - Danil and a Part-time Job dfs序+线段树相关推荐

  1. [CodeForces877 E. Danil and a Part-time Job]dfs序+线段树

    [CodeForces877 E.Danil and a Part-time Job]dfs序+线段树 分类:Data Structure SegMent Tree dfn 1. 题目链接 [Code ...

  2. 【Codeforces Round #442 (Div. 2) A】Alex and broken contest

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 注意是所有的名字里面,只出现了其中某一个名字一次. [代码] #include <bits/stdc++.h> usin ...

  3. 【Codeforces Round #442 (Div. 2) C】Slava and tanks

    [链接] 我是链接,点我呀:) [题意] 有n个位置,每个位置都可能有不定数量的tank; 你每次可以选择一个位置投掷炸弹. 并且,这个位置上的所有tank都会受到你的攻击. 并且失去一点体力. 然后 ...

  4. [codeforces] 383C Propagating tree(dfs序+线段树)

    题意: 给你一棵n个结点的树, 以1为根.每个结点有点权.有m次操作: 1.x结点权值 +val,x的儿子权值 −val,x的孙子们 +val,以此类推. 2.询问x的点权: 题解: 我们首先跑一边d ...

  5. codeforces E. Jamie and Tree LCA+dfs序+线段树

    题解: 写起来还稍微有点麻烦. dfs序+线段树可以维护子树的整体修改和查询. 因此,这道题我们要往子树上靠. 我们首先从1号点进行dfs遍历,顺便求出点的dfs序和深度,然后我们采用倍增的思想,可以 ...

  6. Codeforces 343D Water Tree(DFS序 + 线段树)

    题目大概说给一棵树,进行以下3个操作:把某结点为根的子树中各个结点值设为1.把某结点以及其各个祖先值设为0.询问某结点的值. 对于第一个操作就是经典的DFS序+线段树了.而对于第二个操作,考虑再维护一 ...

  7. Codeforces Round #506 (Div. 3)

    Codeforces Round #506 (Div. 3) 实习期间事不多,对div3 面向题解和数据编程了一波 A. Many Equal Substrings 题目链接 A题就是找后缀和前缀重合 ...

  8. Codeforces Round #563 (Div. 2)/CF1174

    Codeforces Round #563 (Div. 2)/CF1174 CF1174A Ehab Fails to Be Thanos 其实就是要\(\sum\limits_{i=1}^n a_i ...

  9. 构造 Codeforces Round #302 (Div. 2) B Sea and Islands

    题目传送门 1 /* 2 题意:在n^n的海洋里是否有k块陆地 3 构造算法:按奇偶性来判断,k小于等于所有点数的一半,交叉输出L/S 4 输出完k个L后,之后全部输出S:) 5 5 10 的例子可以 ...

  10. Codeforces Round #696 (Div. 2) (A ~ E)超高质量题解(每日训练 Day.16 )

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Codeforces Round #696 (Div. 2) (A ~ E)超高质量题解 比赛链接:h ...

最新文章

  1. 5单个编译总会编译全部_玩转Android10(五)源码编译开发中常用命令
  2. lapack安装_VASP环境安装-BoltzTraP-1.2.5安装
  3. 【模板】RMQ问题—st表实现
  4. MySQL学习之路:多实例无法启动排错
  5. VS2005下开发PPC2003和WM50编译器一些设置
  6. Vue.js学习笔记四
  7. 《Android游戏开发详解》——第3章,第3.1节构造方法
  8. 趣拼图最后完成及总结
  9. bzoj 3679: 数字之积
  10. 计算机学业水平没过怎么办,高中学业水平考试两门没通过还能拿到高中毕业证吗...
  11. matlab plot 坐标轴标注,Matlab绘图坐标轴的设置教程
  12. 无线传感网1-简单介绍
  13. 《Python源码剖析》.pdf
  14. html在线预览wordexcel文档,直接在线预览Word、Excel、TXT文件之ASP.NET
  15. Android--最全的启动第三方APP,应用程序(按需启动,历史启动)
  16. logo免费设计app有哪些?好用的logo设计app分享
  17. qt使用鼠标事件获取鼠标在QLabel和Ui界面中的点击位置
  18. 高考临近,各地考点附近1公里范围内的酒店房量处于紧张状态
  19. 安装驱动显卡重启计算机,Win7电脑安装显卡驱动后一直重启的解决方法
  20. 【Shell】Shell脚本中调用另一个脚本的三种方式(fork/exec/source)

热门文章

  1. 计算机wind10切换桌面wind7系统,win10多桌面切换的方法以及开启步骤是怎样的
  2. JavaScript语法学习
  3. 当identity_insert 设置为off时不能为表_最近新get日志测试方法,再也不用为故障响应慢发愁!...
  4. ubuntu apt 卸载 golang
  5. sed替换html标签,sed多次替换
  6. 基于SSM的猫头鹰在线视频网站
  7. 对于tf.nn.sparse_softmax_cross_entropy_with_logits(logits=y,labels=tf.argmax(y_,1))的研究
  8. 面试官:都说阻塞 I/O 模型将会使线程休眠,为什么 Java 线程状态却是 RUNNABLE?
  9. RequestContextHolder 获取 ServletRequest 和 ServletResponse,Spring MVC ModelAndView 数据响应 Response
  10. LayaAir graphics 绘制文本