Codeforces Round #442 (Div. 2) 877E - Danil and a Part-time Job dfs序+线段树
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序+线段树相关推荐
- [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 ...
- 【Codeforces Round #442 (Div. 2) A】Alex and broken contest
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 注意是所有的名字里面,只出现了其中某一个名字一次. [代码] #include <bits/stdc++.h> usin ...
- 【Codeforces Round #442 (Div. 2) C】Slava and tanks
[链接] 我是链接,点我呀:) [题意] 有n个位置,每个位置都可能有不定数量的tank; 你每次可以选择一个位置投掷炸弹. 并且,这个位置上的所有tank都会受到你的攻击. 并且失去一点体力. 然后 ...
- [codeforces] 383C Propagating tree(dfs序+线段树)
题意: 给你一棵n个结点的树, 以1为根.每个结点有点权.有m次操作: 1.x结点权值 +val,x的儿子权值 −val,x的孙子们 +val,以此类推. 2.询问x的点权: 题解: 我们首先跑一边d ...
- codeforces E. Jamie and Tree LCA+dfs序+线段树
题解: 写起来还稍微有点麻烦. dfs序+线段树可以维护子树的整体修改和查询. 因此,这道题我们要往子树上靠. 我们首先从1号点进行dfs遍历,顺便求出点的dfs序和深度,然后我们采用倍增的思想,可以 ...
- Codeforces 343D Water Tree(DFS序 + 线段树)
题目大概说给一棵树,进行以下3个操作:把某结点为根的子树中各个结点值设为1.把某结点以及其各个祖先值设为0.询问某结点的值. 对于第一个操作就是经典的DFS序+线段树了.而对于第二个操作,考虑再维护一 ...
- Codeforces Round #506 (Div. 3)
Codeforces Round #506 (Div. 3) 实习期间事不多,对div3 面向题解和数据编程了一波 A. Many Equal Substrings 题目链接 A题就是找后缀和前缀重合 ...
- 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 ...
- 构造 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 的例子可以 ...
- Codeforces Round #696 (Div. 2) (A ~ E)超高质量题解(每日训练 Day.16 )
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Codeforces Round #696 (Div. 2) (A ~ E)超高质量题解 比赛链接:h ...
最新文章
- 5单个编译总会编译全部_玩转Android10(五)源码编译开发中常用命令
- lapack安装_VASP环境安装-BoltzTraP-1.2.5安装
- 【模板】RMQ问题—st表实现
- MySQL学习之路:多实例无法启动排错
- VS2005下开发PPC2003和WM50编译器一些设置
- Vue.js学习笔记四
- 《Android游戏开发详解》——第3章,第3.1节构造方法
- 趣拼图最后完成及总结
- bzoj 3679: 数字之积
- 计算机学业水平没过怎么办,高中学业水平考试两门没通过还能拿到高中毕业证吗...
- matlab plot 坐标轴标注,Matlab绘图坐标轴的设置教程
- 无线传感网1-简单介绍
- 《Python源码剖析》.pdf
- html在线预览wordexcel文档,直接在线预览Word、Excel、TXT文件之ASP.NET
- Android--最全的启动第三方APP,应用程序(按需启动,历史启动)
- logo免费设计app有哪些?好用的logo设计app分享
- qt使用鼠标事件获取鼠标在QLabel和Ui界面中的点击位置
- 高考临近,各地考点附近1公里范围内的酒店房量处于紧张状态
- 安装驱动显卡重启计算机,Win7电脑安装显卡驱动后一直重启的解决方法
- 【Shell】Shell脚本中调用另一个脚本的三种方式(fork/exec/source)
热门文章
- 计算机wind10切换桌面wind7系统,win10多桌面切换的方法以及开启步骤是怎样的
- JavaScript语法学习
- 当identity_insert 设置为off时不能为表_最近新get日志测试方法,再也不用为故障响应慢发愁!...
- ubuntu apt 卸载 golang
- sed替换html标签,sed多次替换
- 基于SSM的猫头鹰在线视频网站
- 对于tf.nn.sparse_softmax_cross_entropy_with_logits(logits=y,labels=tf.argmax(y_,1))的研究
- 面试官:都说阻塞 I/O 模型将会使线程休眠,为什么 Java 线程状态却是 RUNNABLE?
- RequestContextHolder 获取 ServletRequest 和 ServletResponse,Spring MVC ModelAndView 数据响应 Response
- LayaAir graphics 绘制文本