CodeForces 877E DFS序+线段树

题意

就是树上有n个点,然后每个点都有一盏灯,给出初始的状态,1表示亮,0表示不亮,然后有两种操作,第一种是get x,表示你需要输出x的子树和x本身一共有几个灯是亮的。pow x,表示你需要改变x的子树和x本身上的灯的状态。

题解思路

这个题肯定是用DFS序了,为啥?因为树不好操作啊(我也不会啊),使用DFS序可以把树压成一维的一串数,这样就可以使用线段树来进行区间操作了。

话说这个题是我暑假限时训练中做的,看到这个题老开心了,但是让我万万没想到的是,这个题我交了11次才过,太心酸了。

代码实现

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<string>
#include<iostream>
#include<vector>
using namespace std;
const int  maxn=2e5+100;
struct node{int l, r;int sum;int lazy;
}t[maxn<<2];
vector<int> g[maxn];
int num[maxn];
int in[maxn], out[maxn], rk[maxn], cnt;
int n, m;
void dfs(int u, int fa) //
{in[u]=++cnt;//这个是u进去的是时间rk[cnt]=u; //不要忘了这个,这个是新生成的序列,也就是树被压成一维的那个数列。就是这忘了,害的我好苦。int len=g[u].size();for(int i=0; i<len; i++){int v=g[u][i];if(v==fa) continue;dfs(v, u);  }   out[u]=cnt;
}
void up(int rt)
{t[rt].sum=t[rt<<1].sum+t[rt<<1|1].sum;
}
void build(int rt, int l, int r)
{t[rt].l=l;t[rt].r=r;t[rt].sum=0;t[rt].lazy=0;if(l==r){t[rt].sum=num[rk[l]]; //这里也不要能错了,很重要。return ;}int  mid=(l+r)>>1;build(rt<<1, l, mid);build(rt<<1|1, mid+1, r);up(rt);
}
void down(int rt)
{if(t[rt].lazy==0) return ;int ls=rt<<1, rs=rt<<1|1;t[ls].lazy=!t[ls].lazy;t[ls].sum=t[ls].r-t[ls].l+1-t[ls].sum;t[rs].lazy=!t[rs].lazy;t[rs].sum=t[rs].r-t[rs].l+1-t[rs].sum;t[rt].lazy=0;
}
void update(int rt, int l, int r)
{if(l <= t[rt].l && t[rt].r <= r ){t[rt].lazy = !t[rt].lazy;t[rt].sum=t[rt].r-t[rt].l+1-t[rt].sum;return ;}down(rt);int mid=(t[rt].l+t[rt].r)>>1;if(l<=mid) update(rt<<1, l, r);if(r>mid)  update(rt<<1|1, l, r);up(rt);
}
int query(int rt, int l, int r)
{if(l <= t[rt].l && t[rt].r <= r){return t[rt].sum;}int ans=0;down(rt);int mid=(t[rt].l+t[rt].r)>>1;if(l<=mid) ans+=query(rt<<1, l, r);if(r>mid) ans+=query(rt<<1|1, l, r);return ans;
}
void init()
{cnt=0;for(int i=0; i<=n; i++){g[i].clear();}
}
int main()
{scanf("%d", &n);{cnt=0;int x;string op;if(n==1){scanf("%d", &x);scanf("%d" , &m);while(m--){int tmp;cin>>op;scanf("%d", &tmp);if(op=="get") printf("%d\n", x);else x=!x;}return 0;}for(int i=2; i<=n; i++){scanf("%d", &x);g[x].push_back(i);g[i].push_back(x);}dfs(1, 0);for(int i=1; i<=n; i++){scanf("%d", &num[i]);}build(1, 1, n);scanf("%d", &m);for(int i=1; i<=m; i++){cin>>op;scanf("%d", &x);if(op=="get"){printf("%d\n", query(1, in[x], out[x]));}else{update(1, in[x], out[x]);}}}return 0;
}

转载于:https://www.cnblogs.com/alking1001/p/11405929.html

CodeForces 877E DFS序+线段树相关推荐

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

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

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

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

  3. New Year Tree(dfs序+线段树+二进制)

    题意: 给出一棵 n个节点的树,根节点为 1.每个节点上有一种颜色 ci.m次操作.操作有两种: 1 u c:将以 u为根的子树上的所有节点的颜色改为c. 2 u:询问以 u为根的子树上的所有节点的颜 ...

  4. 求和(dfs序+线段树)

    题意: 已知有n个节点,有n−1条边,形成一个树的结构. 给定一个根节点k,每个节点都有一个权值,节点i的权值为vi​. 给m个操作,操作有两种类型: 1 a x :表示将节点a的权值加上x 2 a ...

  5. 【XSY2667】摧毁图状树 贪心 堆 DFS序 线段树

    题目大意 给你一棵有根树,有\(n\)个点.还有一个参数\(k\).你每次要删除一条长度为\(k\)(\(k\)个点)的祖先-后代链,问你最少几次删完.现在有\(q\)个询问,每次给你一个\(k\), ...

  6. [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 ...

  7. bzoj3252攻略 贪心+dfs序+线段树

    题目链接:戳这里 3252: 攻略 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 605  Solved: 255 [Submit][Status] ...

  8. 【BZOJ-3252】攻略 DFS序 + 线段树 + 贪心

    3252: 攻略 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 339  Solved: 130 [Submit][Status][Discuss] ...

  9. dfs序+线段树 BZOJ3252 攻略

    3252: 攻略 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 496  Solved: 211 [Submit][Status][Discuss] ...

  10. Jittery Roads Gym - 100889J (虚树 + DP + dfs 序, + 线段树)

    每次给一个点集, 求每个点到其他所有点的最大距离: 会修改边权; 修改边权之后, 我们可以用 dfs 序 + 线段树维护 当前点到根节点的距离. 还可以用树状数组 + 差分思想 维护. { dfs 序 ...

最新文章

  1. 盘点Git的那些冷门玩法
  2. 网络工程师面试PK--胜者为王
  3. vs code python_用VScode配置Python开发环境
  4. 最短路径之--floyd算法--多源最短路径
  5. boost::geometry模块自定义多边形示例
  6. Java大数一些个人的见解
  7. atoi 原来将字符串02002xzm100转换为int以后是2002
  8. 【金融系列】使用Python分析债券,画零息利率曲线,对债券进行精确定价,计算债券的麦考利久期、修正久期和凸度,并进行价格敏感性分析
  9. 数学分析高等代数考研试题不断更新中
  10. vue中用cdn引入优化vender.js大小,和cdn 引入mint-ui的问题
  11. IOS 蓝牙相关-BabyBluetooth蓝牙库介绍(4)
  12. postgresql立式版本下载_PostgreSQL下载_PostgreSQL最新官方版下载_3DM单机
  13. C#不用ArcEngine,生成Shp文件(五)---------读取.shx文件和生成.shx文件
  14. 接受投资人投入材料一批_接受投资者投入材料的会计分录
  15. pwn在matlab中怎么搭建,PWN题搭建
  16. 青木的书籍,--股票
  17. SpringBoot项目的云服务器部署
  18. windows 子系统 linux (WLS):启用Win10的Linux子系统
  19. 基于THREEJS场景中模型局部辉光效果
  20. usart串口发送与接收问题

热门文章

  1. 【Spring-IOC】依赖注入
  2. Git操作的基本命令
  3. Android开发之实现图片自动滚动显示标签的ViewPager
  4. Mybatis插件机制原理
  5. Redis 对象系统
  6. SOS Dynamic Programming
  7. Gartner预测公有云将迎来“双头垄断”局面
  8. 动手动脑(Java)
  9. 【Go语言】I/O专题
  10. Luogu1156 垃圾陷阱