codeforces 396C On Changing Tree dfs序+BIT

单细胞分析实战:用R语言绘制带连线的堆叠柱状图(附完整代码) 本文详细介绍了如何使用R语言绘制带连线的堆叠柱状图进行单细胞转录组数据分析,特别适用于展示细胞比例变化趋势。通过完整代码示例和实战技巧,帮助研究者优化多组别比较的可视化效果,提升科研图表质量。 阅读详情

    一棵树,根节点为1,现有两种操作

1 v x k :对节点v的值+x,对节点v的后继中,距离为i的节点的值+x-i*k。

2 v :输出节点v现在的值。

对子树进行操作的话,容易想到树状数组或者线段树,先对树做一遍dfs标上时间戳,这样节点v的子树的时间戳就是l[v]--r[v]这个区间,那么对子树的加减就可以转化成区间的加减。再来看操作,操作一v的操作可以看成+x-0*k,或者说是x+deep[v]*k-deep[v]*k,对于v的一个孩子u,就是x+deep[v]*k-deep[u]*k,对于一个距离v为i的后继t,就是x+deep[v]-deep[t]*k,可以找到这几项加的项是相同的,而减的项取决于当前的节点,那么每次操作1的时候,就可以把加的项和减的项用梁颗线段树或者两个树状数组分别统计起来,减的项不同层的值虽然不同,但是k是相同的,而deep可以在dfs的时候存好,查询的时候直接用,所以减的项存k的总和就行,区间查找+单点查询,线段树和树状数组都可以实现,树状数组还好写点...

#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
using namespace std;
typedef long long ll;
const int maxn=330000;
const ll MOD=1000000007;

int n,m;

struct BIT
{
    ll dt[maxn];
    void init()
    {
        memset(dt,0,sizeof dt);
    }
    int lowbit(int x)
    {
        return (-x)&x;
    }
    void modify(int x,ll c)
    {
        if (x==0 || x>n) return;
        for (int x1=x; x1<=n; x1+=lowbit(x1))
        {
            dt[x1]+=c;
            dt[x1]%=MOD;
        }
    }
    ll query(int x)
    {
        ll res=0;
        for (int x1=x; x1>0; x1-=lowbit(x1))
        {
            res+=dt[x1];
            res%=MOD;
        }
        return res;
    }
}bit[2];

vector<int> g[maxn];
int l[maxn],r[maxn];
int tt;
ll dis[maxn];
void dfs(int p,int fa)
{
    if (p>1) dis[p]=dis[fa]+1;
    tt++;
    l[p]=tt;
    int v;
    for (int i=0; i<g[p].size(); i++)
    {
        v=g[p][i];
        dfs(v,p);
    }
    r[p]=tt;
}

int main()
{
//    freopen("in.txt","r",stdin);
    scanf("%d",&n);

    memset(l,0,sizeof l);
    memset(r,0,sizeof r);
    int u,v;
    for (int i=1; i<=n; i++) g[i].clear();
    for (int i=2; i<=n; i++)
    {
        scanf("%d",&v);
        g[v].push_back(i);
    }
    tt=0;
    memset(dis,0,sizeof dis);
    dfs(1,-1);
//    for (int i=1; i<=n; i++)
//    cout<<l[i]<<" "<<r[i]<<endl;
//        cout<<dis[i]<<endl;
    bit[0].init();
    bit[1].init();
    scanf("%d",&m);
    int tp;
    ll x,y,z;
    while(m--)
    {
        scanf("%d",&tp);
        if (tp==1)
        {
            scanf("%I64d%I64d%I64d",&x,&y,&z);
            bit[0].modify(l[x],y+dis[x]*z);
            bit[0].modify(r[x]+1,-y-dis[x]*z);
            bit[1].modify(l[x],z);
            bit[1].modify(r[x]+1,-z);
        }
        else
        {

            scanf("%d",&v);
            ll ans=bit[0].query(l[v])-(bit[1].query(l[v])*dis[v])%MOD;
            ans=(ans%MOD+MOD)%MOD;
            cout<<ans<<endl;
        }
    }
    return 0;
}


【软件系统架构】系列六:系统工程 系统工程是一种跨学科方法论,用于分析、设计、集成和管理复杂系统的全生命周期。其核心特点包括系统性思维、全周期管理、跨学科协作和需求导向。主流采用V模型生命周期,涵盖需求分析、系统设计、实现、测试验证及运维退役等阶段。核心工作方法包括需求工程、系统建模、接口设计、风险管理等。系统工程与项目管理协同,分别侧重技术实现和进度资源管理。应用领域覆盖航天军工、智能制造、智慧城市等。未来将向AI融合、数字孪生、模型驱动工程等方向发展,为复杂系统开发提供系统化协作范式。 阅读详情

相关推荐

ABB机器人姿态与四元数(笔记)

通常使用机器人作业时,机器人的法兰轴(5轴)往往是垂直与作业平面的,此时需要将机器人的姿态调整(示教)到垂直于工作平面的状态,然后记录当前的姿态,作为之后作业的参考标准姿态。不同机器人表示控件姿态的方式不一样,但也无外乎3中:旋转矩阵、欧拉角和四元数。 ABB机器人使用的是四元数(可转欧拉角)作为机器人控件姿态的表示方式。这里主要是记录在不通过示教的方式下,如何定义四元数,使机器人达到垂直于工作平面的姿态。 5轴竖直向下(常用):此时,各轴角度为 [0,0,0,0,9...

Zythonista的博客 1万+

CodeForces-171D Broken checker

D. Broken checker "This problem is rubbish! There is not statement, and there are only 5 test cases. The problemsetter took liberties with this problem!" — people complained in the comments to one ro

Yuki_fx的博客 560

Altium Designer操作技巧(1)——原理图中如何批量替换元器件?

《AltiumDesigner批量替换元器件技巧分享》摘要:本文介绍了两种在AltiumDesigner中批量替换元器件的实用方法。方法一通过“查找相似对象”功能,可精准匹配并批量修改器件参数;方法二利用ActiveBOM功能,在BOM表中直观操作器件替换,推荐使用第二种方法可使BOM管理更高效。这些技巧能有效减少物料种类、降低贴装成本,特别适用于电阻电容等常用器件的批量替换。关注公众号获取更多电子设计技巧。

u012526819的博客 2587

Codeforces Round #392 (Div. 2)E. Broken Tree

题目大意:        对于一棵树有n个点,n-1条边,每条边有4个值x,y,w,p,x是离根进的点,y是另一个点,p和w都是特征值,又定义了broken tree的要求是一条边的p小于它所连子树的所有边的w,要求把给定的树装换成w和最大的非broken树(转换过程中只能减不能加,而且树的的w必定为正整数) 题目解法:       先分析误解问题,如果一棵树本身有存有边的p小于子树w和的话

bigwatermlon的博客 877

python爬虫自动下载网页链接

需求分析 今天遇到一个简单的需求,需要下载澳大利亚电力市场NEM日前市场的发电商报价数据(http://nemweb.com.au/Reports/Current/Next_Day_Offer_Energy/),页面观感是这样的: Ctrl + F 一下,看到一共有395个zip链接。于是就想着用python爬虫自动下载。这个网页很简单,没有验证码,甚至不需要登录,因此自动下载的pytho...

da_kao_la的博客 1万+

千兆以太网的接收和crc校验

解析该以太网帧,包括统计该以太网帧长度+过滤功能(端口号对不对,是否为udp协议)+CRC校验,将解析结果存入状态fifo,一旦状态fifo开始有数,就开始开启读过程,读过程开始时,首先读状态fifo,根据从状态fifo里面读出的以太网帧长度,来读数据fifo(这样能够防止跨帧读),然后在根据状态fifo里面读出的crc校验正确标志和过滤标志,来确定是否将数据fifo读出来的数据送给下一个模块。改掉之后在抓一下,可以看到抓出来的数据完全正确,从最后开始看,除去4个crc校验的尾巴,数据是到255结束的。

weixin_45284871的博客 2740

Codeforces Round #392 (div.2) E:Broken Tree

orz一开始想不画图做这个题(然后脑袋就炸了,思维能力有待提高) 我的做法是动态规划+贪心+构造 首先把题目给的树变成一个可行的情况,同时weight最小 这个可以通过动态规划解决 dp[x]表示以x为结点的子树,它的最小weight是多少 接着我们就只需要考虑每条边增加多少就可以了,这里可以用贪心的做法 ddfs(int x, int fa, int v) 这里v是表示给x结点最大多少...

weixin_34310785的博客 146

基于业务目标的Agent自动化评测体系设计:超越准确率的有效性衡量

我们还是以电商全链路服务Agent我们还是以电商全链路服务Agent。

AI架构全栈开发实战笔记 318

Codeforces 396C (DFS序+线段树)

题面 传送门 题目大意: 给定一棵树,每个点都有权值,边的长度均为1,有两种操作 操作1:将节点u的值增加x,并且对于u的子树中的任意一个点v,将它的值增加x-dist(u,v)*k, dist(u,v)表示u,v之间的距离 操作2:查询节点u的值 分析 这类题目需要用到一个重要的思想:将树上操作转化为区间操作 通过DFS序我们可以实现这一点. 对于每个节点x,我们记录它在前序遍...

oier_forever的博客 453

英飞凌TC3xx--深度手撕HSM安全启动(三)--TC3xx HSM系统架构

TC3xx的HSM内核是一颗32位的ARM Cortex M3,主频可达100MHz,支持对称算法AES128、非对称算法PKC(Public Key Crypto) ECC256、Hash SHA2,以及TRNG(真随机数生成)。

认真搞搞汽车MCU 5748

【26美赛F题 To Gen-AI, or Not To Gen-AI】(MCM/ICM)思路解析及代码分享

摘要:本文研究生成式人工智能(Gen-AI)对三类职业(STEM、技能型工艺、艺术)的影响,建立量化模型预测未来10-20年岗位需求变化。通过分析AI替代效应($R_{sub}(t)$)和增强效应($R_{enh}(t)$),提出差异化高校课程调整策略:STEM专业需加强AI集成能力,技能型工艺专业应结合智能工具与实操训练,艺术专业需平衡AI创作辅助与原创性培养。模型表明,高校通过针对性课程优化可提升毕业生在AI时代的就业竞争力,为教育决策提供数据支持。(149字)

一键难忘的博客 639

CodeForces - 396C On Changing Tree(树状数组)

题目大意:给一棵树,树上的点初始化是0,现在给出两种操作 1 v x k:v这个结点加上x,然后和v距离为i的所有子结点加上 x - (i * k) 2 v:询问v这个节点的值解题思路:先dfs处理出每个节点所包含的子孙结点的区域l和r,还有每个点的深度dep, 假设我Modify(l[v], x + k * dep[v])和Modify(r[v] + 1, -(x + k * dep[v])

静静地码 767

《QT+PCL》点云的点选与框选

【代码】《QT+PCL》点云的点选与框选。

阁楼 3602

Codeforces Round 232 Div 1 C On Changing Tree 树状数组 或 线段树

题目地址 http://codeforces.com/problemset/problem/396/C 树状数组,对于搞括号序列还是有一手的,关键是因为括号序列的题老是逮着某个点询问,而他的更新又往往是涉及一棵子树。 当然,树状数组的更新也要满足可加性的。 对于向某棵子树上的节点均增加 X 这种操作,我们可以在括号序列的左端点增加x,右端点+1处增加 -x,这样查询到内部的时候就会增加x,

用心一也 639

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

codeforces 258-E. Little Elephant and Tree 线段树,离线

给一个节点数为n的树,m个操作,每个操作包涵两个数a,b,第i次操作时,向节点a及其子树,节点b及其子树的数据序列中添加i。m次操作完成后,对于每个节点,查询这棵树上有多少个节点与当前节点至少包涵一个相同数。          首先对子树操作的话,先对树做dfs并编号,这样某节点的子树节点的编号一定是一个连续的区间,并记录一下每个节点子树节点编号的范围,这样操作就是一个线段树的区间更新了。

Broken Wings 1352

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

codeforces 379F New Year Tree 在线LCA

一棵树,根节点为1,有2,3,4三个叶子节点,接下来有N个操作,每个操作x,表示给节点x添加两个孩子节点,并且输出添加后树的直径。        当时做这套题的时候不会LCA,写了个暴力的爬山坡,结果复测时喜闻乐见的TLE了= =...现在学了LCA要果断虐回来...分别每次记录直径的两个端点各自的父亲节点d1,d2,初始值d1=d2=1,然后每次添加时,找一下x到d1和x到d2的距离那个更大,

Broken Wings 1259

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

codeforces 425C Sereja and Two Sequences DP

两个长度分别为n,m的序列,序列中的数da

Broken Wings 1239

Codeforces 380D Sereja and Cinema

#223Div1的第四题,题意大致是一排n个座位,每个座位两侧有个电源(那么总共就是n+1个电源),每来一个人坐在某个位置上后,他就会占用这个座位两侧的电源,如果只剩一个可用就用一个,如果两个都被占了,他就会生气的离开,现在如果个别位置上的人是第几个入场确定的话,问如何安排省下位置上的人的进场顺序,可以使所有人都能有至少一个电源用而不至于生气的离开。         这题一直没什么思路,昨天拿去

Broken Wings 1230

CF Round 192

P1:n*m的矩形上

Broken Wings 1027

Codeforces 383D. Antimatter

n个数(1..1000),从这串数中选取一个字串,任意添加数前的正负号,若以一种方案加上符号后该字串的和为0,则是一种可行的方案,问对这n个数共有多少种可行的方案(字串大小任意,至少为2(1个数怎么也凑不出0...))。n个数的和不超过10000.一般情况下,题目的条件都是有用的,这道题就是从n个数的和不超过10000入手.dp[i][j]记录以第i个数为终点,此时和为j的方案数.转移方程dp[i

Broken Wings 998

codeforces 7D Palindrome Degree 字符串hash

如果一个长度为n的字符串s,如果前

Broken Wings 979

codeforces 452E Three strings 后缀数组+并查集

给三个串s1,s2,s3,对于meig

Broken Wings 978

codefroces 486C Hack it! 数位dp+二分

定义f(x)是x的各位数字之和(xshijinzhi)

Broken Wings 955

codeforces 388B Fox and Minimal path

给一个数k,让构造出一个节点数小于1000的图,使得这个图上从1到2的最短路的路径数恰好为k.       当天做的时候直接想到分解质因数去做,但这么做对大质数无解=然后就被cha掉了...今天在网上看到一个神奇的做法... 原帖在这:http://7-sun.com/text/25918.html 举个例子 1 3 4 5 6 7 8 9 10 11 2 除了起点终点,

Broken Wings 884

codeforces 258B - Little Elephant and Elections 数位DP

给一个数m,在1到m当中先挑一个数出来,再从剩下的数当中挑6个数,要求这六个数保函数字4或7的个数严格小于挑出第一个数包涵的4或7..先递推求出dp[i][j],表示长度为i的数中,包涵j个4,7的数的个数,再从高位开始推,求出1-m当中,包涵k个4,7的分别有多少个(s[k])。思路挺好想,之前只做过一两道数位DP的题,结果递推式推出来各种呵呵....这东西果然是写多了就熟练了...     

Broken Wings 882

codeforces 388C Fox and Card Game

若干堆牌,每张牌有不同的分值,两个人,一个人每次选一堆拿走顶端的牌,另一个人选一堆,拿走堆底的牌,两人都是最优策略,问最后每人多少分...看起来好像是个博弈,实际上感觉就是个脑筋急转弯,因为最优的情况,最后一定是每一堆两人各去一半,然后轮流拿走奇数堆中间的牌...因为如果某一堆的最优点偏下的话,B一定能强迫A只能拿到中间,如果最优点偏上,那么A同样一定也能强迫B只能拿到中间为止..所以最后就是一人

Broken Wings 880
上一篇: hdu3980 Paint Chain 组合nim
下一篇: zoj 3765 Lights splay
NightRaven
博客等级 码龄15年 30粉丝 249原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值