简要题意

给出一个 \(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. Vue学习之--------监视属性(2022/7/10)

    文章目录 1.监视属性 1.1 监视属性--天气案例 1.1.1 基础知识 1.1.2 代码实例 1.1.2 测试效果 1.2 深度监视-天气案例 1.2.1 基础知识 1.2.2 代码实例 1.2. ...

  2. python读取文本数据某一列

    import codecs f = codecs.open('test1 - 副本.txt', mode='r', encoding='utf-8') # 打开txt文件,以'utf-8'编码读取 l ...

  3. 基于.NetCore开发博客项目 StarBlog - (19) Markdown渲染方案探索

    前言 笔者认为,一个博客网站,最核心的是阅读体验. 在开发StarBlog的过程中,最耗时的恰恰也是文章的展示部分功能. 最开始还没研究出来如何很好的使用后端渲染,所以只能先用Editor.md组件做 ...

  4. MQTT+esp32+nodered+springboot 智能家居项目 -- 项目准备

    1.后台系环境:idea  jdk8.0以上  maven   tomcat   spring boot 2.前端环境  nodejs  nodered 3.硬件环境: audrion   esp32 ...

  5. 自动化利器 Ansible - 从了解到应用

    本文说明 本系列使用 ansible 2.9.27 版本来说明和汇总相关信息. # cat /etc/system-release Red Hat Enterprise Linux Server re ...

  6. Linux网络通信(TCP套接字编写,多进程多线程版本)

    预备知识 源IP地址和目的IP地址 IP地址在上一篇博客中也介绍过,它是用来标识网络中不同主机的地址.两台主机进行通信时,发送方需要知道自己往哪一台主机发送,这就需要知道接受方主机的的IP地址,也就是 ...

  7. 图解ReentrantLock底层公平锁和非公平锁实现原理

    在面试或者日常开发当中,经常会遇到公平锁和非公平锁的概念. 两者最大的区别如下 1️⃣ 公平锁:N个线程去申请锁时,会按照先后顺序进入一个队列当中去排队,依次按照先后顺序获取锁.就像下图描述的上厕所的 ...

  8. 领域驱动设计(DDD)在美团点评业务系统的实践

    前言 至少 30 年以前,一些软件设计人员就已经意识到领域建模和设计的重要性,并形成一种思潮,Eric Evans 将其定义为领域驱动设计(Domain-Driven Design,简称 DDD).在 ...

  9. 面试官不按套路,竟然问我Java线程池是怎么统计线程空闲时间?

    背景介绍: 你刚从学校毕业后,到新公司实习,试用期又被毕业,然后你又不得不出来面试,好在面试的时候碰到个美女面试官! 面试官: 小伙子,我看你简历上写的项目中用到了线程池,你知道线程池是怎样实现复用线 ...

  10. 在 Solidity 中 ++i 为什么比 i++ 更省 Gas?

    前言 作为一个初学者,"在 Solidity 中 ++i 为什么比 i++ 更省 Gas?" 这个问题始终在每个寂静的深夜困扰着我.也曾在网上搜索过相关问题,但没有得到根本性的解答 ...