简要题意

给出一个 \(n\) 个节点的以 \(1\) 为根的树,每一个节点 \(i\) 带权 \(w_i\),初始时所有节点的权均为 \(0\)。有 \(m\) 个操作,支持以下操作:

  • 1 x,对于所有树上节点 \(i\),进行以下操作:
\[w_i=\begin{cases}1&(\operatorname{Depth}({i})\geq x)\\0&(\text{otherwise})\end{cases}
\]
  • 2 x,询问以 \(x\) 为根的子树的所有节点的权值和。

\(1 \leq n,m \leq 10^{5}\),允许离线

思路

首先可以得出 2 操作的答案仅与之前的最后一次 1 操作有关,所以我们把操作离线下来,设最后一次 \(1\) 操作是 1 t,那么操作 2 v 其实是在求以 \(t\) 为根的子树中有多少个深度大于等于 \(t\) 的节点。统计深度自然想到按照深度建一个权值线段树森林。树上 DFS 处理询问。先把儿子合并到父亲上,然后直接回答查询即可(这里询问是线段树基本操作,不讲)。

时间复杂度 \(O(m\log n)\)。

代码

#include <bits/stdc++.h>
#define int long long
#define ls(i) (t[i].ls)
#define rs(i) (t[i].rs)
#define mid ((l+r)>>1)
using namespace std; const int N = 1e5+5;
struct node{
int ls,rs,v;
} t[N<<8];
int root[100005],tot;
int n,m; inline void newnode(int &i){
if(!i)i=(++tot);
} void pushup(int i){
t[i].v=t[ls(i)].v+t[rs(i)].v;
} void insert(int p,int v,int &i,int l,int r){
newnode(i);
if(l==r){
t[i].v++;
return;
}
if(p<=mid){
insert(p,v,ls(i),l,mid);
}
else{
insert(p,v,rs(i),mid+1,r);
}
pushup(i);
} void merge(int &x,int &y){
if(x==0||y==0){
if(y)x=y;
if(x)y=x;
return;
}
t[x].v+=t[y].v;
merge(ls(x),ls(y));
merge(rs(x),rs(y));
} int query(int ql,int qr,int i,int l,int r){
if(!i)return 0;
if(ql<=l&&r<=qr){
return t[i].v;
}
int res=0;
if(ql<=mid){
res+=query(ql,qr,ls(i),l,mid);
}
if(qr>mid){
res+=query(ql,qr,rs(i),mid+1,r);
}
return res;
} struct edge{
int nxt,to;
} g[1000005];
int head[1000005],ec;
void add(int u,int v){
g[++ec].nxt=head[u];
g[ec].to=v;
head[u]=ec;
} int dep[1000005];
struct Query{
int x,tmd;
Query(int X=0,int TMD=0){
x=X,tmd=TMD;
}
}; int ret[1000005];
vector<Query> q[100005]; void dfs(int u,int fa){
dep[u]=dep[fa]+1;
for(int i=head[u];i;i=g[i].nxt){
int v=g[i].to;
if(v==fa)continue;
dfs(v,u);
}
} void solve(int u,int fa){
for(int i=head[u];i;i=g[i].nxt){
int v=g[i].to;
if(v==fa)continue;
solve(v,u);
merge(root[u],root[v]);
}
for(Query i:q[u]){
ret[i.tmd]=query(i.x,n,root[u],1,n);
}
} signed main(){
ios::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL);
cin>>n>>m;
for(int i=1,u,v;i<n;i++){
cin>>u>>v;
add(u,v);add(v,u);
}
dfs(1,0);
for(int i=1;i<=n;i++){
insert(dep[i],1,root[i],1,n);
}
int last_dep=n+1,two_cnt=0;
while(m--){
int op,u;
cin>>op>>u;
if(op==1){
last_dep=u;
continue;
}
q[u].push_back(Query(last_dep,(++two_cnt)));
}
solve(1,0);
for(int i=1;i<=two_cnt;i++){
cout<<ret[i]<<'\n';
}
return 0;
}

P8844 [传智杯 #4 初赛] 小卡与落叶的更多相关文章

  1. 第三届“传智杯”全国大学生IT技能大赛(初赛A组)题解

    留念 C - 志愿者 排序..按照题目规则说的排就可以.wa了两发我太菜了qwq #include<bits/stdc++.h> using namespace std; const in ...

  2. 第四届“传智杯”全国大学生IT技能大赛题解

    目录 A B C D E F G 今年题目难度普遍偏低.只有 D,F 还好. A 按题目给的公式计算即可.注意应在最后的答案中去掉小数部分. B 按照题意模拟即可.注意答案要与 \(0\) 取 \(\ ...

  3. 传智播客DotNet面试题

    技术类面试.笔试题汇总(整理者:杨中科,部分内容从互联网中整理而来) 注:标明*的问题属于选择性掌握的内容,能掌握更好,没掌握也没关系. 下面的参考解答只是帮助大家理解,不用背,面试题.笔试题千变万化 ...

  4. Socket小项目的一些心得(鸣谢传智的教学视频)

    Socket是一种封装了四层通信的整体抽象入口,通常也称作"套接字",这是常用的四层通信这是访问Socket的流程图,这个分为客户端和服务器端,其中服务器端有以下步骤去建立,前面的 ...

  5. 传智博客(JavaWeb方面的所有知识)听课记录(经典)

    一.       JavaWeb基础 第一天: 1.Eclipse详解: (1).Bad versionnumber in .class file:编译器版本和运行(JRE)版本不符合.高的JRE版本 ...

  6. 传智播客C语言视频第二季(第一季基础上增加诸多C语言案例讲解,有效下载期为10.5-10.10关闭)

    卷 backup 的文件夹 PATH 列表卷序列号为 00000025 D4A8:14B0J:.│  1.txt│  c语言经典案例效果图示.doc│  ├─1传智播客_尹成_C语言从菜鸟到高手_第一 ...

  7. 传智播客C语言视频第一季(有效下载期为10.1-10.7,10.8关闭)

     J:\传智播客_尹成_C语言从菜鸟到高手├─传智播客_尹成_C语言从菜鸟到高手_第一章C语言概述A│      第一讲1.1C语言第一阶段.mp4│      第二讲1.2c语言入门教程.mp4 ...

  8. 揭秘传智播客毕业班的超级薪水7k内幕系列II----Offer工资表5.7k,为什么不能让老师就业就业

    在上海传智播客宋学生Java六期学员.在班级尚未毕业阶段,私自投递简历,而且逃课去面试,获得某国企的Offer.入职薪资5.7K,,兼有五险一金.饭补等齐全福利,因就业老师要求班级同学未毕业不要急于就 ...

  9. 揭秘上海传智播客平均工资超过7k 其中一位知情人士

    大学毕业生人数破700万大关.如何破解"毕业即失业"中国式的大学困境? 2014年全国高校毕业生总数将达到727万人,比被称为"史上最难就业年"的2013年再添 ...

随机推荐

  1. 中国制霸生成器「GitHub 热点速览 v.22.42」

    火遍推特的中国制霸生成器本周一开源就占据了两天的 GitHub Trending 榜,不知道你的足迹遍布了多少个省份呢?同样记录痕迹的 kanal 用了内存读写方式解决了 Rust 的消息处理问题,P ...

  2. 消息队列之RabbitMQ介绍与运用

    RabbitMQ 说明 本章,我们主要从RabbitMQ简介.RabbitMQ安装.RabbitMQ常用命令.RabbitMQ架构模式.RabbitMQ使用.Quick.RabbitMQPlus的使用 ...

  3. 《上传那些事儿之Nest与Koa》——文件格式怎么了!

    转载自:juejin - 马睿不想说话 概要 本文主要针对在使用node作为服务端接口时,前端上传上传文件至node作为中转,再次上传至oss/cdn的场景.以及针对在这个过程中,需要对同一个文件进行 ...

  4. 转载:Python 实现百度翻译

    来源: https://blog.csdn.net/qq_44814439/article/details/105642066 作者: Chloemxc 功能: Python 实现百度翻译 from ...

  5. Mysql+Mycat+NFS+Rsync+LVS+DNS+IPtables综合实验

    1.环境准备 服务器 IP地址 作用 系统版本 Mysql-master eth0:10.0.0.58 主数据库 Rocky8.6 Mysql-slave1 eth0:10.0.0.68 备数据库 R ...

  6. JS 可编辑表格的实现(进阶)

    1.前言 在普通的可编辑表格的基础上,改进可编辑表格.数据来自外部的json(模拟服务端),通过json数据生成可编辑表格.根据实际情况,表格没有新增数据功能.表格的可编辑列,计算的列,每列的数据大小 ...

  7. linux下搭建oh-my-zsh环境

    目标:因为用习惯了zsh的shell环境,所以习惯在服务器上也搭建zsh环境,但是每次搭建都需要Google每一步骤,感觉很麻烦,所以决定记录一下,免得一次次查 1. 安装zsh zsh是一款shel ...

  8. 2022,一个Java程序猿的外设配置

    工欲善其事,必先利其器. 是的没错,我就是个器材党,哈哈.正赶上搬家布置了新桌面,经过我的精心挑选和安装,也是凑齐了我新一套的桌面外设.写下来记录一下. 键盘 套件:腹灵MK870 轴体:佳达隆G白P ...

  9. windows socket网络编程--事件选择模型

    目录 事件选择模型概述 API详解 工作原理 代码实现 事件选择模型概述 Winsock提供了另一种有用的异步事件通知I/O模型--WSAEventSelect模型.这个模型与WSAAsyncSele ...

  10. K8S之prometheus-operator监控

    prometheus-operator 1. Prometheus Operator介绍 介绍文章:http://t.zoukankan.com/twobrother-p-11164391.html ...