【codeforces 620E】【dfs】【线段树 】【lazy】【子树区间修改,区间求和】

2023-10-20 04:38

本文主要是介绍【codeforces 620E】【dfs】【线段树 】【lazy】【子树区间修改,区间求和】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

https://codeforces.com/problemset/problem/620/E

【题意】

子树区间修改,区间求和

【分析】先将树形结构通过dfs序转化为线性结构,子树的操作转化为线性区间上的操作,加个2进制ll存储val,lazy标记更新

【代码】

  好久没写线段树了,呜呜呜

#include<bits/stdc++.h>
using namespace std;
using ll = long long;
const int maxn = 1e6 + 6;
int c[maxn], pos[maxn];
vector<int>v[maxn];//线段树部分----------------------------------------------------------
struct node {int l, r;ll val;int lazy;int mid(void) {return l + r >> 1;}
}tr[maxn<<2];void pushDown(int p) {if (tr[p].lazy) {tr[p << 1].lazy = tr[p << 1 | 1].lazy = tr[p].lazy;tr[p << 1 | 1].val = tr[p << 1].val = 1LL << tr[p].lazy;tr[p].lazy = 0;}
}void build(int p, int l,int r) {tr[p].l = l;tr[p].r = r;tr[p].lazy = 0;tr[p].val = 0;if (l == r) {tr[p].val = 1LL << c[pos[l]];return;}int mid = tr[p].mid();build(p << 1, l, mid);build(p << 1 | 1, mid + 1, r);tr[p].val = tr[p << 1].val | tr[p << 1 | 1].val;
}void update(int p, int l, int r, int L, int R, int x) {if (L <= tr[p].l&&tr[p].r <= R) {tr[p].lazy = x;tr[p].val = 1LL << x;return;}pushDown(p);int mid = tr[p].mid();if (L <= mid)update(p << 1, l, mid, L, R, x);if (R > mid)update(p << 1 | 1, mid + 1, r, L, R, x);tr[p].val = tr[p << 1].val | tr[p << 1 | 1].val;
}ll query(int p, int l, int r, int L,int R) {if (L <= l && r <= R) {return tr[p].val;}pushDown(p);int mid = tr[p].mid();ll res = 0;if (L <= mid)res |= query(p << 1, l, mid, L, R);if (R > mid)res |= query(p << 1 | 1, mid + 1, r, L, R);tr[p].val = tr[p << 1].val | tr[p << 1 | 1].val;return res;
}//dfs部分---------------------------------------------------------------
int dfsL[maxn], dfsR[maxn];
int tot = 0;
//获得每个节点1->tot的编号
void dfs(int p, int f ) {//L,R表示一个子树的范围dfsL[p] = ++tot;pos[tot] = p;for (int q : v[p]) {if (q == f)continue;dfs(q, p);}dfsR[p] = tot;
}int main() {int n, m;while (~scanf("%d%d", &n, &m)) {for (int i = 1; i <= n; i++) {scanf("%d", &c[i]);v[i].clear();}for (int i = 1; i < n; i++) {int x, y;scanf("%d%d", &x, &y);v[x].push_back(y);v[y].push_back(x);}dfs(1, 0);build(1, 1, n);while (m--) {int op;scanf("%d", &op);if (op == 1) {int v, x;scanf("%d%d", &v, &x);update(1, 1, n, dfsL[v], dfsR[v], x);}else {int v;scanf("%d", &v);ll ans = query(1, 1, n, dfsL[v], dfsR[v]);printf("%d\n", bitset<1000>(ans).count());}}}
}

 

这篇关于【codeforces 620E】【dfs】【线段树 】【lazy】【子树区间修改,区间求和】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/244712

相关文章

SQL Server修改数据库名及物理数据文件名操作步骤

《SQLServer修改数据库名及物理数据文件名操作步骤》在SQLServer中重命名数据库是一个常见的操作,但需要确保用户具有足够的权限来执行此操作,:本文主要介绍SQLServer修改数据... 目录一、背景介绍二、操作步骤2.1 设置为单用户模式(断开连接)2.2 修改数据库名称2.3 查找逻辑文件名

Oracle修改端口号之后无法启动的解决方案

《Oracle修改端口号之后无法启动的解决方案》Oracle数据库更改端口后出现监听器无法启动的问题确实较为常见,但并非必然发生,这一问题通常源于​​配置错误或环境冲突​​,而非端口修改本身,以下是系... 目录一、问题根源分析​​​二、保姆级解决方案​​​​步骤1:修正监听器配置文件 (listener.

Linux中修改Apache HTTP Server(httpd)默认端口的完整指南

《Linux中修改ApacheHTTPServer(httpd)默认端口的完整指南》ApacheHTTPServer(简称httpd)是Linux系统中最常用的Web服务器之一,本文将详细介绍如何... 目录一、修改 httpd 默认端口的步骤1. 查找 httpd 配置文件路径2. 编辑配置文件3. 保存

Nginx 413修改上传文件大小限制的方法详解

《Nginx413修改上传文件大小限制的方法详解》在使用Nginx作为Web服务器时,有时会遇到客户端尝试上传大文件时返回​​413RequestEntityTooLarge​​... 目录1. 理解 ​​413 Request Entity Too Large​​ 错误2. 修改 Nginx 配置2.1

Python对PDF书签进行添加,修改提取和删除操作

《Python对PDF书签进行添加,修改提取和删除操作》PDF书签是PDF文件中的导航工具,通常包含一个标题和一个跳转位置,本教程将详细介绍如何使用Python对PDF文件中的书签进行操作... 目录简介使用工具python 向 PDF 添加书签添加书签添加嵌套书签Python 修改 PDF 书签Pytho

Spring框架中@Lazy延迟加载原理和使用详解

《Spring框架中@Lazy延迟加载原理和使用详解》:本文主要介绍Spring框架中@Lazy延迟加载原理和使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录一、@Lazy延迟加载原理1.延迟加载原理1.1 @Lazy三种配置方法1.2 @Component

Docker镜像修改hosts及dockerfile修改hosts文件的实现方式

《Docker镜像修改hosts及dockerfile修改hosts文件的实现方式》:本文主要介绍Docker镜像修改hosts及dockerfile修改hosts文件的实现方式,具有很好的参考价... 目录docker镜像修改hosts及dockerfile修改hosts文件准备 dockerfile 文

Python实现无痛修改第三方库源码的方法详解

《Python实现无痛修改第三方库源码的方法详解》很多时候,我们下载的第三方库是不会有需求不满足的情况,但也有极少的情况,第三方库没有兼顾到需求,本文将介绍几个修改源码的操作,大家可以根据需求进行选择... 目录需求不符合模拟示例 1. 修改源文件2. 继承修改3. 猴子补丁4. 追踪局部变量需求不符合很

Linux修改pip和conda缓存路径的几种方法

《Linux修改pip和conda缓存路径的几种方法》在Python生态中,pip和conda是两种常见的软件包管理工具,它们在安装、更新和卸载软件包时都会使用缓存来提高效率,适当地修改它们的缓存路径... 目录一、pip 和 conda 的缓存机制1. pip 的缓存机制默认缓存路径2. conda 的缓

Linux修改pip临时目录方法的详解

《Linux修改pip临时目录方法的详解》在Linux系统中,pip在安装Python包时会使用临时目录(TMPDIR),但默认的临时目录可能会受到存储空间不足或权限问题的影响,所以本文将详细介绍如何... 目录引言一、为什么要修改 pip 的临时目录?1. 解决存储空间不足的问题2. 解决权限问题3. 提