Apple Tree【树链剖分模板题】

2023-11-06

There is an apple tree outside of kaka's house. Every autumn, a lot of apples will grow in the tree. Kaka likes apple very much, so he has been carefully nurturing the big apple tree.

The tree has N forks which are connected by branches. Kaka numbers the forks by 1 to N and the root is always numbered by 1. Apples will grow on the forks and two apple won't grow on the same fork. kaka wants to know how many apples are there in a sub-tree, for his study of the produce ability of the apple tree.

The trouble is that a new apple may grow on an empty fork some time and kaka may pick an apple from the tree for his dessert. Can you help kaka?

 

 

Input

The first line contains an integer N (N ≤ 100,000) , which is the number of the forks in the tree.
The following N - 1 lines each contain two integers u and v, which means fork u and fork v are connected by a branch.
The next line contains an integer M (M ≤ 100,000).
The following M lines each contain a message which is either
"x" which means the existence of the apple on fork x has been changed. i.e. if there is an apple on the fork, then Kaka pick it; otherwise a new apple has grown on the empty fork.
or
"x" which means an inquiry for the number of apples in the sub-tree above the fork x, including the apple (if exists) on the fork x
Note the tree is full of apples at the beginning

Output

For every inquiry, output the correspond answer per line.

Sample Input

3
1 2
1 3
3
Q 1
C 2
Q 1

Sample Output

3
2

  题意:Q:求以它为节点的子节点的数目(包括自己);C:该节点要是没有苹果就生成一个,有苹果就吃掉……


#include <iostream>
#include <cstdio>
#include <cmath>
#include <string>
#include <cstring>
#include <algorithm>
#include <limits>
#include <vector>
#include <stack>
#include <queue>
#include <set>
#include <map>
#define lowbit(x) ( x&(-x) )
#define pi 3.141592653589793
#define e 2.718281828459045
#define INF 0x3f3f3f3f
#define HalF (l + r)>>1
#define ls rt<<1
#define rs rt<<1|1
#define Lson ls, l, mid
#define Rson rs, mid+1, r
#define QL Lson, ql, qr
#define QR Rson, ql, qr
#define myself rt, l, r
using namespace std;
typedef unsigned long long ull;
typedef long long ll;
const int maxN = 1e5 + 7;
int N, M, head[maxN], cnt, root[maxN], deep[maxN], siz[maxN], W_son[maxN], top[maxN], id[maxN], num, W[maxN];
struct Eddge
{
    int nex, to;
    Eddge(int a=-1, int b=0):nex(a), to(b) {}
}edge[maxN<<2];
inline void addEddge(int u, int v)
{
    edge[cnt] = Eddge(head[u], v);
    head[u] = cnt++;
}
inline void dfs1(int u, int fa, int depth)
{
    root[u] = fa;
    deep[u] = depth;
    siz[u] = 1;
    int minn = -1;
    for(int i=head[u]; i!=-1; i=edge[i].nex)
    {
        int v = edge[i].to;
        if(v == fa) continue;
        dfs1(v, u, depth + 1);
        siz[u] += siz[v];
        if(siz[v] > minn)
        {
            minn = siz[v];
            W_son[u] = v;
        }
    }
}
inline void dfs2(int u, int topf)
{
    top[u] = topf;
    id[u] = ++num;
    W[num] = 1;
    if(W_son[u] == -1) return;
    dfs2(W_son[u], topf);
    for(int i=head[u]; i!=-1; i=edge[i].nex)
    {
        int v = edge[i].to;
        if(v == W_son[u] || v == root[u]) continue;
        dfs2(v, v);
    }
}
int tree[maxN<<2];
inline void pushup(int rt)
{
    tree[rt] = tree[rt<<1] + tree[rt<<1|1];
}
inline void build(int rt, int l, int r)
{
    if(l == r)
    {
        tree[rt] = W[num];
        return;
    }
    int mid = HalF;
    build(Lson);
    build(Rson);
    pushup(rt);
}
inline void update(int rt, int l, int r, int qx)
{
    if(l == r)
    {
        tree[rt] ^= 1;
        return;
    }
    int mid = HalF;
    if(qx <= mid) update(Lson, qx);
    else update(Rson, qx);
    pushup(rt);
}
inline int query(int rt, int l, int r, int ql, int qr)
{
    if(ql <= l && qr >= r) return tree[rt];
    int mid = HalF;
    if(ql > mid) return query(QR);
    else if(qr <= mid) return query(QL);
    else return query(QL) + query(QR);
}
inline void init()
{
    cnt = num = 0;
    memset(head, -1, sizeof(head));
    memset(W_son, -1, sizeof(W_son));
}
char op[5];
int main()
{
    while(scanf("%d", &N)!=EOF)
    {
        init();
        for(int i=1; i<N; i++)
        {
            int e1, e2; scanf("%d%d", &e1, &e2);
            addEddge(e1, e2);
            addEddge(e2, e1);
        }
        dfs1(1, 1, 0);
        dfs2(1, 1);
        build(1, 1, N);
        scanf("%d", &M);
        while(M--)
        {
            scanf("%s", op);
            if(op[0] == 'Q')
            {
                int x;  scanf("%d", &x);
                printf("%d\n", query(1, 1, N, id[x], id[x] + siz[x] - 1));
            }
            else
            {
                int x;  scanf("%d", &x);
                update(1, 1, N, id[x]);
            }
        }
    }
    return 0;
}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Apple Tree【树链剖分模板题】 的相关文章

  • 【源码篇】基于ssm+vue+微信小程序的医疗科普小程序

    系统介绍 这是一个ssm vue 微信小程序的医疗科普小程序 分为pc端和微信小程序端 pc端包括 管理员角色和学生角色 管理员拥有 学生管理 科普知识管理 论坛管理 收藏管理 试卷管理 留言板管理 试题管理 系统管理 考试管理 学生端拥有
  • keil中下载程序界面设置

    下午在调试DAU的时候忽然出现internal command error的情况 以往是将下载器重新上电或编译器重启既可 但是今天这一招怎么也不灵光了 换一个硬件可以正常下载 不死心 试着修改下载器选项 当Connect选择为Under R
  • 游戏UI特效教程 章鱼学院UI动效基础课(68课)

    本文包含两大单元 展示类动效原型单元 可交互动效原型单元 在展示类动效单元中 我们会着重利用AE这款软件 由浅入深的 对三个案例进行学习并制作 通过学习这个单元的知识 大家可以掌握UI动效中 AE基本的使用技巧 并在带领下完成三个案例 通过
  • ts 移动端h5 拍照预览

    通过typescript实现一个简单版本 移动端 拍照 和预览功能 1 需求列表 点击拍照唤起手机后置摄像头 拍照完成在页面预览照片 2 技术实现 2 1 布局和唤起后置摄像头 唤起摄像头采用 input 里面 type file 类型 为
  • Shell脚本攻略:文本三剑客之sed

    目录 一 理论 1 sed 二 实验 1 sed命令的寻址打印 2 显示奇偶 3 查找替换 4 后向引用 5 截取版本号 6 替换IP地址 一 理论 1 sed 1 概念 sed 英文全称为stream editor流式编辑器 sed 对输
  • neo4j学习笔记

    文章目录 neo4j note 一 概述 1 链接 2 介绍 数据模型 二 使用 1 环境搭建 2 CQL 1 创建 Create 2 查询Match 3 Return 4 关系基础 创建 1 现有节点之间创建无属性的关系 2 现有节点之间
  • 哈夫曼树构造哈夫曼编码

    在传输文字时 经常要将文字转换成二进制字符串 所以我们希望编码最短 但是又想保证它的唯一性 哈夫曼树具有最小带权路径长度 用来实现编码就可以编码最短 所以用哈夫曼树来构造编码 而前缀编码就可以保证在解码的时候不会出现多种可能 就实现了唯一性
  • 第二章。c#变量和数据输入

    1 C 中常见的数据类型 1 整型 整数类型 表示整数 比如年 月 日 年龄等都是整数 整型的关键字 int 最常用的 short long 2浮点型 带小数点的数 比如身高 米 体重 100 5kg 等都是浮点数 浮点型分成两种 1 单精
  • quartz对于定时任务Misfire的处理

    使用quartz过程中 产生了很多问题 遇到就记录一下 虽然用的比较少了 但还是有一些项目在使用 问题描述 创建一个每天执行的任务test1 创建自动运行状态 然后停止任务 一直等到当天定时时间过去 然后再启动 发现定时任务还是先执行了一次
  • 在Bios中开启虚拟化设置

    1 进入BIOS 开机时按baiF2或F12或DEL或ESC等键 各电脑有所不同 2 进入duBIOS后 找到Configuration选项 选zhi择Intel Virtual Technology并回车 将光标dao移至Enabled
  • C++使用模板实现元素的反序

    实现任意类型序列中元素的反序 所涉知识点 示例代码 开发环境 运行结果 注意 所涉知识点 阅读此文需要掌握的知识点 回调函数 模板类 类模板 栈 示例代码 这里直接上代码 pragma once include
  • Qt中的并发

    QThread是一个低级 low level 类 适合用于显式地构建长期运行的线程 QtConcurrent是一个命名空间 提供了用于编写并发软件的更高层次的类和算法 该命名空间中有一个重要的类 QThreadPool 这是一个管理线程池的
  • [第四届-强网杯]:Funhash

随机推荐

  • C#的基本知识

    1 static修饰符 本页介绍 static 修饰符关键字 static 关键字也是 using static 指令的一部分 使用 static 修饰符可声明属于类型本身而不是属于特定对象的静态成员 static 修饰符可用于声明 sta
  • Spring中事务几个常见的问题

    首先 事务这个概念是数据库层面的 Spring只是基于数据库中的事务进行扩展 以及提供了一些能让程序员更新方便操作事务的方式 Spring如何处理事务 Spring中支持编程式事务和声明式事务管理两种方式 1 编程式事务 可以使用Trans
  • 一天内Boss转发5k次,「高性能Java:核心原理案例实战」已被封杀

    前言 市面上讲Java框架的书很多 包括SpingBoot SpringCloud Kafka等 但这些书通常只会让你技术的 量 增长 而 质 仍处于SSM的阶段 而且互联网上并没有体系化 结构化的提升技术的 质 的教材 于是团长行动了起来
  • ubuntu环境下编译内核详解

    一 下载源代码和编译软件的准备 下载内核源代码 http www kernel org 注意 点击2 6 25内核的F版 即完整版 如果你懒得去网站点联接 运行下列命令 代码 cd wget http www kernel org pub
  • c语言代码中调用系统命令行.sh shell脚本,linux shell system传参

    C语言代码中调用命令行 1 使用system 命令行 执行完命令行后 会返回原先C代码的位置 继续执行 2 如果命令行中需要传参 使用 sprintf 先处理好命令行的内容 再 system system echo 123 int a 3
  • C/C++基本数据类型所占字节数

    关于这个基本的问题 很早以前就很清楚了 C标准中并没有具体给出规定那个基本类型应该是多少字节数 而且这个也与机器 OS 编译器有关 比如同样是在32bits的操作系统系 VC 的编译器下int类型为占4个字节 而tuborC下则是2个字节
  • 文件的结构及存取方法

    文件的组织形式是文件的结构 从不同的角度分析文件有不同的结构形式 逻辑结构和物理结构 从用户角度出发 研究文件的抽象组织方式而定义的文件组织形式为文件的逻辑结构 从系统的角度出发 研究文件的物理组织方式而定义的文件组织形式为文件的物理结构
  • 【虚拟机】VMware16保姆级安装教程

    大家好 我是雷工 工作中需要用到各种各样的工控软件 有时候甚至需要不同版本的软件 但频繁装卸软件比较麻烦 而且像WinCC和博图软件对系统要求比较严格 卸载重装可能就出问题 此时就不得不重装系统 重装系统各种软件都需要重装一遍 费时费力 这
  • 七、Python基础(异常、模块、文件操作)

    七 Python基础 异常 模块 文件操作 目录 七 Python基础 异常 模块 文件操作 一 异常 1 抛出异常 2 简单的捕获异常语法 3 错误类型的捕获 4 异常捕获的完整语法 5 异常的传递 6 raise 主动抛出异常 二 模块
  • 关于面向对象中的get 和set方法的总结,为什么不用public的详解,详解。

    我们都知道去构造一个实体类的时候 标准都是去 private 一个私有变量 然后再给这个私有 变量加上 公开 get 和 set 我总是会忍不住去想一下 为什么不直接去public 变量 是为了什么 是一种标准 还是说有什么好处 发现网上确
  • 行为驱动开发(BDD)你准备好了吗?

    GitChat 作者 冰尘 原文 行为驱动开发 BDD 你准备好了吗 关注微信公众号 GitChat 技术杂谈 一本正经的讲技术 不要错过文末彩蛋 这个Chat笔者将会和大家一起探讨下面的主题 什么是行为驱动开发 BDD 为什么使用行为驱动
  • STM32+ESP8266(ESP-12F)物联网温度计-移植paho MQTT协议连接阿里云

    STM32 ESP8266 ESP 12F 物联网温度计 移植paho MQTT协议连接阿里云 目录 STM32 ESP8266 ESP 12F 物联网温度计 移植paho MQTT协议连接阿里云 一 硬件及软件准备 1 硬件 STM32单
  • stm32串口通信,收发字符串,并对其进行解析

    串口以字符串接收和发送 将传输的数据转化为整数 正负 stm32发送端 motor position Read Encoder Angle Encoder sensor position Get Adc Average Angle Adc
  • Java后端WebSocket的Tomcat实现

    一 WebSocket简单介绍 随着互联网的发展 传统的HTTP协议已经很难满足Web应用日益复杂的需求了 近年来 随着HTML5的诞生 WebSocket协议被提出 它实现了浏览器与服务器的全双工通信 扩展了浏览器与服务端的通信功能 使服
  • SSM框架学习记录-Spring_day01

    1 核心概念 当前项目中的问题 下面代码的实现十分简单 但是业务层需要调用数据层的方法 就要在业务层new数据层的对象 如果数据层的实现类发生变化 业务层的代码也需要跟着改变 意味着要编译打包和重新部署 数据层实现 public class
  • pytorch实现深度学习常用图像分类数据集的划分与读取(Oxford-102flower,CIFAR10/CIFAR100)

    Oxford 102flower花分类数据集 CIFAR10 CIFAR100数据集 Oxford 102flower Oxford 102flower是牛津工程大学于2008年发布的用于图像分类的数据集 总共分为102个类 每个类包含40
  • Centos7通过宝塔安装mysql

    文章目录 一 在桌面安装数据库 安装好可以修改端口号 二 开放3306端口号 打开远程访问权限 2 1开放3306端口号 2 1 为需要远程登录的用户赋予权限 三 查看密码 第一种方式控制面板查看 第二种方式修改密码 四 测试 五 修改连接
  • Python压缩目录文件夹,解压目录文件夹及耗时效率统计

    Python用zip file压缩文件夹 用unzip file解压文件夹 1 压缩效果对比 发现压缩率挺低的 压缩前 28 9MB 压缩后依然 27 8MB 2 压缩耗时 运用了Python 装饰器 拦截每个方法 并输出方法的耗时 可以参
  • spark用submit提交程序遇到的错误(机器内存较小)

    部署使用的spark版本是spark1 3 0部署环境 主节点centos7操作系统 2g内存 从节点debian系统1g内存 2个 spark env sh的设置如下 export SCALA HOME usr local scala 2
  • Apple Tree【树链剖分模板题】

    There is an apple tree outside of kaka s house Every autumn a lot of apples will grow in the tree Kaka likes apple very