zoj 3686 树转化为数组表示,线段树区间更新

zoj 2112 Dynamic Rankings 带修改区间第k大的几种解法 给出n个数,有两种操作,一种是修改某个数的值,另一种查询指定区间第k大。 比较快的做法是树套树,而分块算法复杂度比较高写起来方便。分块算法可以很简单的处理单独修改某个值的情况。 将n个数分成num块,每块大小siz=n/num。每一块内部排序进行排序,查询[l,r]第k大时,先二分答案,对于完全包含在区间的内块直接二分搜索,而对于区间两端只有部分包含的则直接遍历查找。复杂度是logn*(2*s 阅读详情

A Simple Tree Problem

Time Limit: 3 Seconds      Memory Limit: 65536 KB

Given a rooted tree, each node has a boolean (0 or 1) labeled on it. Initially, all the labels are 0.

We define this kind of operation: given a subtree, negate all its labels.

And we want to query the numbers of 1's of a subtree.

Input

Multiple test cases.

First line, two integer N and M, denoting the numbers of nodes and numbers of operations and queries.(1<=N<=100000, 1<=M<=10000)

Then a line with N-1 integers, denoting the parent of node 2..N. Root is node 1.

Then M lines, each line are in the format "o node" or "q node", denoting we want to operate or query on the subtree with root of a certain node.

Output

For each query, output an integer in a line.

Output a blank line after each test case.

Sample Input

3 2
1 1
o 2
q 1

Sample Output

1


Author: CUI, Tianyi
Contest: ZOJ Monthly, March 2013


先用dfs对树进行先序遍历并记录下每个节点的位置pos[rt]和它的儿子数tot[rt],这样就将同一棵子树按先序顺序保存在连续的数组区间,然后就转化为线段树求解区间和问题,遍历+区间更新O(n+mlogn)复杂度


#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>

using namespace std;


#define maxn 100005

vector<int> g[maxn];    //保存每个节点的儿子
int tot[maxn];  //每个节点的儿子数
int pos[maxn];  //每个节点转为数组后对应的位置
int n, m;

int count(int rt, int &cur) //先序遍历确定位置,并统计儿子数
{
    pos[rt] = cur++;
    int sum = 1;
    for(int i = 0; i < g[rt].size(); i++)
        sum += count(g[rt][i], cur);

    tot[rt] = sum-1;
    return sum;
}

int begin[4*maxn], end[4*maxn], sum[4*maxn];
bool lazy[4*maxn];

void build(int rt, int l, int r)
{
    begin[rt] = l; end[rt] = r;
    sum[rt] = 0; lazy[rt] = 0;
    if(l == r)
        return;

    int m = (l+r)>>1;
    build(2*rt, l, m);
    build(2*rt+1,m+1,r);
}

int query(int rt, int ll, int rr)
{
    int lc = 2*rt, rc =2*rt+1;
    if(ll == begin[rt] && rr == end[rt])
        return sum[rt];
    else{
        if(lazy[rt]){
            sum[lc] = end[lc]-begin[lc]+1-sum[lc];
            sum[rc] = end[rc]-begin[rc]+1-sum[rc];
            lazy[lc] = !lazy[lc];
            lazy[rc] = !lazy[rc];
            lazy[rt] = 0;
        }
    }

    int m = (begin[rt]+end[rt])>>1;
    if(rr <= m)
        return query(lc, ll, rr);
    else if(ll > m)
        return query(rc, ll, rr);
    else
        return query(lc,ll,m)+query(rc,m+1,rr);
}

void modify(int rt, int ll, int rr)
{
    int lc = 2*rt, rc = 2*rt+1;
    if(ll == begin[rt] && rr == end[rt]){
        sum[rt] = end[rt]-begin[rt]+1-sum[rt];
        lazy[rt] = !lazy[rt];
        return;
    }
    else{
        if(lazy[rt]){
            sum[lc] = end[lc]-begin[lc]+1-sum[lc];
            sum[rc] = end[rc]-begin[rc]+1-sum[rc];
            lazy[lc] = !lazy[lc];
            lazy[rc] = !lazy[rc];
            lazy[rt] = 0;
        }
    }

    int m = (end[rt]+begin[rt])>>1;
    if(rr <= m)
        modify(lc, ll, rr);
    else if(ll > m)
        modify(rc, ll, rr);
    else{
        modify(lc, ll, m);
        modify(rc, m+1, rr);
    }

    sum[rt] = sum[lc]+sum[rc];
}

int main()
{
    while(~scanf("%d %d", &n, &m)){
        for(int i = 0; i <n+2; i++) g[i].clear();
        int t;
        for(int i = 0; i < n-1; i++){
            scanf("%d", &t);
            g[t].push_back(i+2);
        }

        int cur = 1;
        count(1,cur);
        build(1,1,n);

        char op[2];
        int num;
        for(int i = 0 ; i < m; i++){
            scanf("%s %d", op, &num);

            if(op[0] == 'o')
                modify(1, pos[num], pos[num]+tot[num]);
            else
                printf("%d\n", query(1, pos[num], pos[num]+tot[num]));
        }
       printf("\n");
    }
    return 0;
}


kmp求字符串最小周期 总时间限制: 3000ms 内存限制: 65536kB 描述 给定两个字符串a和b,我们定义a*b为他们的连接。例如,如果a=”abc” 而b=”def”, 则a*b=”abcdef”。 如果我们将连接考虑成乘法,一个非负整数的乘方将用一种通常的方式定义:a^0=””(空字符串),a^(n+1)=a*(a^n)。 输入每一个测试样例是一行可打印的字符作为输入,用s表示。s 阅读详情

相关推荐

稳健自适应波束形成学习(2):自适应计算对角加载量方法——基于广义线性组合的鲁棒Capon波束形成

对于快拍数相对阵元数较小时,样本协方差矩阵不能很好对协方差矩阵进行估计。常规的对角加载量需要根据经验值或不断手动调整进行测试,没有一个明确的准则和推导。该篇介绍一种自适应计算对角加载量的方法,且能适应快拍数相对阵元数较小时的情况。均匀线阵阵元数:18;载波频率30MHz;通信信号来波方向0°、来波估计偏差0.5°;干扰来波方向30°;通信信号信噪比10dB;干扰信号信噪比60dB。也即在干扰角度生成66dB的零陷,通信信号受到16dB的衰减。

a1uajug的博客 825

ZOJ 3686 A Simple Tree Problem

A Simple Tree Problem Time Limit: 3 Seconds      Memory Limit: 65536 KB Given a rooted tree, each node has a boolean (0 or 1) labeled on it. Initially, all the labels are 0. We define this ki

码代码的猿猿 1127

开关电源环路学习笔记(1)-为啥要知道传递函数?

做硬件都会接触到开关电源,或多或少会接触到环路补偿。很多兄弟们也提出来让我说说这个,说明大家也都很关心,也说明这个好像有点难。 就我个人而言,我也想搞明白环路这一块,也查了一些资料,视频,不过说实话,一直都还是懵的,感觉很困难。 具体感觉就是,看资料或视频的时候,感觉好像是那么回事。但是撇开之后,就又云里雾里的感觉,总有一些想法没有找到答案。 问题 比如下面我想过的问题: 开关电源有开关,根本就不是一个线性系统,传递函数是咋弄出来的? 系统环路框图的输入量为什么不是Vin,而是参考电压V

weixin_42005993的博客 1万+

BZOJ3489: A simple rmq problem kdtree

题意:给出一个长度为N的序列,M个询问,每次询问[L,R]中只出现过一次的最大数,不存在输出0,强制在线 N<=100000 M<=200000 卡时神器kdtree暴力水过。 用set预处理出每个元素i前面一个和它相等的元素pre[i]和后面一个和它相等的元素nex[i],则查询变为查询l<=pos<=r,pre < l,nex > r的元素中最大的,用三维kdtree 暴力就可以了。

リーインカーネイション 605

F280049C Buffered Digital-to-Analog Converter (DAC)

使用DAC模块很简单,只需要配置参考电压,并写入DACVALS寄存器一个数字值即可。参考电压可配置为外部参考VDAC和内部参考电压1.65V和2.5V,并结合增益作为DAC模块最终的参考电压DACREF。举个例子,配置参考电压为内部参考电压1.65V,增益设置为2,则参考电压DACREF=3.3V,若向DACVALS写入数字值2048,则输出的DAC模块的输出带电压DACOUT=DACVALS×DACREF4096=1.65VDACOUT=

xht2403267701的博客 2369

VTK基础教程(1)- vtkPolyData 介绍

目录 VTK的编译与环境搭建 VTK一般渲染流程 VTK数据类型-vtkPolyData 使用vtk自带的多边形数据 使用自己创建的数据 添加顶点颜色 添加面颜色 VTK的编译与环境搭建 这部分目前已经有了大佬做了成熟的傻瓜式配置,大家可以参考这篇文章:VTK+VS2019(或其他版本均可) 傻瓜式一站式 配置_Nancy_fairy的博客-优快云博客_vs2019 vtk VTK一般渲染流程 这部分的介绍也很多,大家可以参考这篇文章:VTK笔记-了解VTK_黑山老妖的博客.

qq_35769071的博客 9054

B - A Simple Tree Problem

题目链接:猛戳这里 题目大意:给一棵多叉树,初始值都为0,o x为翻转以x为根的子树,q x为查询以x为根的子树有多少个1 思路:这数据范围,暴力是不行的,怎么暴力都是不行的>_<。这题的要求是:修改一大片、查询一大片,比较容易想到的就是线段树(树状 数组也可以,不过要翻转嘛……好像有难度……反正我不会>_<)。问题是这玩意儿怎么转换成线段树呢?要转化成线段树,就要把每...

weixin_30709809的博客 119

YOLO26改进策略【Neck】| arXiv 2025 分层多头注意力HMHA 子空间拆分提多样 + 通道重排降冗余,强化目标检测精度

HMHA(Hierarchical Multi-Head Attention,分层多头注意力)旨在解决传统多头注意力(MHA)在图像恢复任务中的核心缺陷——特征冗余。传统MHA将通道均匀拆分给各个头,导致不同头学习的子空间信息相似,进而出现多头关注同一区域、忽略退化区域修复的问题,限制了模型的特征表达能力。HMHA通过“分层子空间拆分+通道重排序”策略,让每个头学习差异化、互补的上下文特征,从根源上缓解冗余,提升图像恢复任务中对复杂退化场景的特征捕捉能力。

Limiiiing的博客 210

ZOJ 3686 A Simple Tree Problem (线段树)

题意类似于POJ3321,但是这里每次操作的时候更新了子树中的所有节点值,而且每次查询需要进行延迟标记,所以如果跟POJ3321一样用树状数组不适合,这里用线段树来写,开始先dfs一边用时间戳进行节点标记。 #include #include #include using namespace std; #define MAX 100001 #define lson (rt<<1) #d

BehappyXiang的专栏 767

勇闯dify v1.0.0之设置模型供应商。解决:Reached maximum retries (3) for URL https://marketplace.dify.ai/

朋友们,大家好,今天带大家来勇闯dify v1.0.0。为什么叫勇闯呢?我就这么说吧,本来我昨天就想带大家勇闯v1.0.0的。但是dify的marketplace访问不了。公司的网和手机热点都试了,就是访问不了。我们连个模型都没有,还勇闯个球啊,对吧,就搁置了。今天,我赶紧看看这个marketplace好了没。一看,可以了。赶紧写下这篇博客,帮助同志们走出困境。

xiezhipu的博客 4616

句向量(句嵌入)模型sent2vec的训练及应用

本文讨论NLP中的句向量模型(sent2vec),也就是将一个完整的句子映射成一个实数向量的技术。这方面已经发表的成果也是比较多的,本文中所涉及的技术主要源自NAACL 2018的一篇论文,其中提出的sent2vec模型可以理解为词嵌入技术中经典的CBOW方法的扩展,该所谓的扩展中一个重要改进就是引入了n-gram

白马负金羁 1万+

ZOJ 3686 A Simple Tree Problem(树转线段树+线段树区间更新)

Given a rooted tree, each node has a boolean (0 or 1) labeled on it. Initially, all the labels are 0. We define this kind of operation: given a subtree, negate all its labels. And we want to query the numbers of 1's of a subtree.

HJY 378

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

[DFS序列+线段树维护区间标记]ZOJ3686 A Simple Tree Problem

题目链接 :http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3686 题目大意 :

追 625

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

主席树(可持久化线段树)入门专题

1.poj 2104 查询区间第k小。 主席树其实相当于建立了n棵线段树,第i棵线段树是根据区间【1,i】按值建立的。对于每一棵线段树我们记录它对应的区间每个数出现的次数,所以首先要对所有的数离散化。 先考虑最简单的情况,只查询【1,n】的第k小,对于【1,n】我们按值建立一棵线段树,对于a[i]我们在位置a[i]上加1。查询第k小那么先看左子区间出现了多少个数cnt,假设左区间出现的数cnt

写东西的地方 6180

单调队列的应用

描述 给定一个长度为n(n 下面是一个例子: 数组是 [1 3 -1 -3 5 3 6 7], k = 3。 窗口位置 最小值 最大值 [1  3  -1] -3  5  3  6  7  -1 3  1 [3  -1  -3] 5  3  6  7  -3 3  1  3 [-1  -3  5] 3  6  7

写东西的地方 2391

SPOJ COT2 树上的莫队算法,树上区间查询

题意:n个节点形成的一棵树。每个节点有一个值。m次查询,求出(u,v)路径上出现了多少个不同的数。 树上的莫队算法,同样将树分成siz=sqrt(n)块,然后离线操作。先对树dfs一遍,每当子树节点个数num>=siz,就将这num个分成一块。读取所有的查询按左端点所在块排序。 重点在于怎么进行区间转移,对路径的lca特殊处理,参考博客http://blog.youkuaiyun.com/kuribohg

写东西的地方 2277

poj 2887 块状数组/线段树

Big String Time Limit: 1000MS   Memory Limit: 131072K Total Submissions: 5952   Accepted: 1405 Description You are given a string and supposed to do some string manipul

写东西的地方 1570

hiho #1080 : 更为复杂的买卖房屋姿势 线段树区间更新

时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho都是游戏迷,“模拟都市”是他们非常喜欢的一个游戏,在这个游戏里面他们可以化身上帝模式,买卖房产。 在这个游戏里,会不断的发生如下两种事件:一种是房屋自发的涨价或者降价,而另一种是政府有关部门针对房价的硬性调控。房价的变化自然影响到小Hi和小Ho的决策,所以他们希望能够知道任

写东西的地方 1464

hdu 4819 二维线段树,单点修改区间查询

Mosaic Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 102400/102400 K (Java/Others) Total Submission(s): 916    Accepted Submission(s): 402 Problem Description The God of sheep d

写东西的地方 1406

hdu 5381 莫队算法/gcd

The sum of gcd Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 645    Accepted Submission(s): 279 Problem Description You have an array

写东西的地方 1085

hdu 3308 线段树-区间连续最长上升子序列

LCIS Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 4842    Accepted Submission(s): 2166 Problem Description Given n integers. You ha

写东西的地方 1074

hiho #1079 离散化

#1079 : 离散化 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho在回国之后,重新过起了朝7晚5的学生生活,当然了,他们还是在一直学习着各种算法~ 这天小Hi和小Ho所在的学校举办社团文化节,各大社团都在宣传栏上贴起了海报,但是贴来贴去,有些海报就会被其他社团的海报所遮挡住。看到这个场景,小Hi便

写东西的地方 907

poj 1201 interval 差分约束/贪心+线段树区间更新

Intervals Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 22337   Accepted: 8423 Description You are given n closed, integer intervals [ai, bi] and n integ

写东西的地方 901

kmp代码

void getNext(char* p,int next[]) { int len = strlen(p); int i = 0, j = -1; next[i] = j; while (i < len - 1) { //p[j]表示前缀,p[i]表示后缀 if (j == -1 || p[i] ==

写东西的地方 866

zoj 3649 树上的倍增法

Social Net Time Limit: 5 Seconds      Memory Limit: 65536 KB There are n individuals(2 n <= 30000). Everyone has one or more friends. And everyone can contact all people by friend-relation. If

写东西的地方 825
上一篇: hdu 3506 dp+四边形不等式优化
下一篇: codeforces 515d 拓扑排序/二分图
HuanTongH
博客等级 码龄12年 7粉丝 110原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值