Codeforces Round #336 (Div. 1) D. Power Tree(dfs序线段树)

【李超树】李超线段树维护凸包(凸壳) (例题:blue mary开公司+线段游戏+ZZH的旅行) 这数据结构的代码麻烦其它数据结构学学,点名LCT 阅读详情

题意:

思路:

     首先,直接模拟很不现实,只能先离线,造出空树,再慢慢更新树
     那么现在想一下怎么维护这颗树,首先,我们算每个点对根节点的贡献,发现每个点的贡献可以表示为vi∗sz1∗sz2∗...∗(其中sz1,sz2是这个点和根节点的路径上的点,这些点的直接儿子),只要我们新加入一个节点,假设父亲的直接儿子节点个数为sz,那么这次修改就是把它父亲的这颗子树中的所有节点的贡献乘以sz+1sz。
     然后是查询,如果我们直接查询根,那我们只要把所有点的贡献加起来就行了,可是如果不是根,那我们把他的子树的贡献和处以他父亲的倍率(可以从上面的公式看出来)
    这样,我们就可以把所有操作限定在子树里面了, 说到了子树,那么就应该是dfs序线段树了,这样,我们维护一个sum,一个倍率,每次加点就把该点的父亲的子树都改变一次贡献(sum和倍率都改),查询就找出sum,并除以父亲的倍率即可。
     因为要取模,记得用逆元

错误及反思:

     居然有个地方写了个fa[fa[Q[i].poi]]。。。

代码:

#include<bits/stdc++.h>
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
const int N = 200100;
const long long mod =1000000007;

long long segtree[N<<2],bl[N<<2],lazy[N<<2];
int fa[N],val[N],now=1,id[N],to[N],tot=2,q,sz[N];

struct ope{
    int xz,poi;
};
vector<ope> Q;
vector<int> son[N];

void dfs(int node){
    id[node]=now++;
    for(int i=0;i<son[node].size();i++)
        dfs(son[node][i]);
    to[node]=now-1;
}

long long pow_mod(long long a,long long b){
    long long ret = 1;
    while(b){
        if(b & 1) ret = (ret * a) % mod;
        a = (a * a) % mod;
        b >>= 1;
    }
    return ret;
}

long long Fermat(long long a){return pow_mod(a, mod-2);}

void chang(long long &a,long long b){
    a*=b;
    a%=mod;
}
void pushdown(int l,int r,int rt){
    if(lazy[rt]!=1){
        chang(segtree[rt<<1],lazy[rt]);
        chang(segtree[rt<<1|1],lazy[rt]);
        chang(lazy[rt<<1],lazy[rt]);
        chang(lazy[rt<<1|1],lazy[rt]);
        chang(bl[rt<<1],lazy[rt]);
        chang(bl[rt<<1|1],lazy[rt]);
        lazy[rt]=1;
    }
}
void pushup(int l,int r,int rt){
    segtree[rt]=segtree[rt<<1]+segtree[rt<<1|1];
    segtree[rt]%=mod;
}
void build(int l,int r,int rt){
    if(l==r){
        bl[rt]=1;
        lazy[rt]=1;
        if(l==1) segtree[rt]=val[1];
        else segtree[rt]=0;
        return ;
    }
    int m=(l+r)/2;
    build(lson);
    build(rson);
    bl[rt]=1;
    lazy[rt]=1;
    pushup(l,r,rt);
}


void add(int L,int R,long long v,long long w,int l,int r,int rt){
    if(L<=l&&R>=r){
        chang(bl[rt],v);
        chang(bl[rt],w);
        chang(lazy[rt],v);
        chang(lazy[rt],w);
        chang(segtree[rt],v);
        chang(segtree[rt],w);
        return ;
    }
    pushdown(l,r,rt);
    int m=(l+r)/2;
    if(L<=m) add(L,R,v,w,lson);
    if(R>m) add(L,R,v,w,rson);
    pushup(l,r,rt);
}

void update(int p,int v,int l,int r,int rt)
{
    if(l==r)
    {
        segtree[rt]=v*bl[rt];
        segtree[rt]%=mod;
        return ;
    }
    pushdown(l,r,rt);
    int m=(l+r)/2;
    if(p<=m) update(p,v,lson);
    else update(p,v,rson);
    pushup(l,r,rt);
}
long long querybl(int p,int l,int r,int rt){
    if(l==r)
        return bl[rt];
    pushdown(l,r,rt);
    int m=(l+r)/2;
    long long ans=0;
    if(p<=m) ans=querybl(p,lson);
    else ans=querybl(p,rson);
    pushup(l,r,rt);
    return ans;
}
long long query(int L,int R,int l,int r,int rt){
    if(L<=l&&R>=r){
        return segtree[rt];
    }
    pushdown(l,r,rt);
    int m=(l+r)/2;
    long long ans=0;
    if(L<=m) ans+=query(L,R,lson);
    if(R>m) ans+=query(L,R,rson);
    pushup(l,r,rt);
    ans%=mod;
    return ans;
}
int main(){
    scanf("%d%d",&val[1],&q);
    while(q--){
        int ta,tb,tc;
        scanf("%d",&ta);
        if(ta==1){
            scanf("%d%d",&tb,&tc);
            son[tb].push_back(tot);
            fa[tot]=tb;
            val[tot]=tc;
            Q.push_back({1,tot++});
        }
        else{
            scanf("%d",&tb);
            Q.push_back({2,tb});
        }
    }
    fa[1]=1;
    sz[1]=1;
    tot--;
    dfs(1);
    build(1,tot,1);

    for(int i=0;i<Q.size();i++)
    {
        if(Q[i].xz==1){
            int faq=fa[Q[i].poi];
            long long ny=Fermat(sz[faq]);
            update(id[Q[i].poi],val[Q[i].poi],1,tot,1);
            add(id[faq],to[faq],ny,sz[faq]+1,1,tot,1);
            sz[faq]++;
            sz[Q[i].poi]++;
        }
        else{
            long long ny;
            if(Q[i].poi==1) ny=1;
            else ny=Fermat(querybl(id[fa[Q[i].poi]],1,tot,1));
            long long ans=query(id[Q[i].poi],to[Q[i].poi],1,tot,1);
            chang(ans,ny);

            printf("%lld\n",ans);
        }
    }
}
Mac mini 本地大模型部署:Swift + M 系列芯片实战指南 本地大模型部署正从云端向边缘设备迁移,其核心依赖于高带宽统一内存、专用神经引擎与高效异步编程模型。Apple Silicon 的 M 系列芯片(如 M2 Ultra)通过 800GB/s 内存带宽和 180 TOPS 神经引擎,为 LLaMA-3 等 70B 级模型提供低延迟推理基础;而 Swift 语言凭借对 Metal、ANE 和统一内存的原生支持,将硬件能力封装为简洁 API,实现 `swift urlrequest get` 等操作的透明加速。该技术路径显著降低 AI 应用开发门槛,适用于个人开发者 阅读详情

相关推荐

QT插件学习系列(一) 初识QtPlugin

QT插件学习系列(一) 初识QtPlugin 1、 概述 为什么我们要学习插件化,其和 windows 导出 dll 有什么区别呢? 导出的动态库如果缺失,程序不能运行。但插件可以。 同一套代码,即可分别在 windows 下和 linux 下生成插件。 QT 本身提供两种插件支持,一种称为高级 API,一种称为低级 API。 高级API的作用是扩展 QT 程序本身,需要子类化 QT 提供的插件基类,例如现有的 QTSqlDriver,因此你可也以编写自己的 QTStyle 扩展 QT。 低级

L_Andy的专栏 3113

CodeForces - 1120D Power Tree

题意: 给定一棵有 nnn 个结点的树,点 iii 的费用为 aia_iai​。第一阶段选购一些结点,第二阶段将会给所有叶结点随机赋权 bib_ibi​,第三阶段可进行的操作为,选定第一阶段购买的某点 uuu,对 uuu 子树内所有叶结点加上 xxx,可无限次操作,问在第一阶段最少花费多少,能使得无论 bib_ibi​ 如何,都可以在第三阶段将所有叶结点权值变为 000。并输出所有可能成为最优解的...

weixin_44059127的博客 244

FFmpeg视频编码的流程详解及参考demo

本文主要讲解FFmpeg的视频编码的具体流程,API使用。最后再以一个非常简单的demo演示将一个yuv数据文件编码为H264的视频文件,也就是YUV编码为H264。

分享音视频技术 4498

Codeforces Round #543 D. Power Tree 最小生成树

题目链接: http://codeforces.com/contest/1120/problem/D 题意: 一棵结点带权的树,你要先选择其中若干个结点,同时付出他们的花费和,然后保证以这些结点为根的子树上的叶子加减上一定的值,可以让这些叶子在任意初始值的状态下变成 000 。 做法: 因为要保证叶子的值无论在什么初始状态下都能最后变成 000 ,稍微推一下其实是可以感觉到最少选叶子结点的数量的值...

人生如戏 253

AI视频生成提示词工程:结构化公式与实战案例详解

在实际使用 AI 生成视频或图像时,最常遇到的困惑是:为什么我的提示词(Prompt)生成的画面总是不理想?是模型能力不足,还是我的描述有问题?答案往往是后者。提示词工程(Prompt Engineering)并非简单的“翻译”需求,而是一门需要结构化思维和精准描述的技能。它决定了 AI 能否准确理解你的意图,并生成符合预期的视觉内容。 本文将通过两个核心案例,深入拆解提示词的构建逻辑。第一个案例聚焦于“文生视频”,我们将学习如何将一个简单的想法,如“小猫在雪地里玩雪球”,通过结构化公式扩展为一段富有细节和

weixin_30800987的博客 555

Proxmox VE网络配置踩坑实录:从Web界面无法访问到完美修复的全过程

本文详细记录了Proxmox VE服务器Web界面无法访问的完整排查与修复过程。作者从基础网络连通性测试入手,逐步排查了服务状态、SSL证书、端口监听、防火墙规则及网关配置,最终定位并解决了问题。文章提供了系统性的故障排查思路和实用的修复命令,对管理Proxmox VE网络具有重要参考价值。

weixin_29231221的博客 888

20221119-实例HI3516A底板PowerTree提取

20221119-实例HI3516A底板PowerTree提取

tlx1025的博客 3004

2.4G跳频算法 2.4G切信道算法 (简例示意nRF52832)

2.4G跳频算法 nRF52832示例 2.4G自适应信道算法

Peter.Min 955

[CF1120D]Power Tree

zxy 好妹啊。zc 也很认可这个观点。

七代目鸽影 482

HFSS实战项目——微带带通滤波器设计

本文详细介绍并设计了一款微带带通滤波器,通过HFSS三位电磁仿真软件对其进行仿真设计及优化,仿真结果表明,本文设计的滤波器表现出优良的滤波性能,符合设计要求。

2401_87464239的博客 5390

基于YOLOv26的卫星遥感环境监测系统

本文介绍了一个基于YOLOv26的卫星遥感环境监测系统。该系统采用分层架构设计,包含数据采集、预处理、目标检测、图像分析、变化检测等核心模块。技术栈包括YOLOv26、PyTorch、OpenCV等深度学习框架和图像处理工具,以及GDAL、rasterio等地理信息处理库。系统支持获取多种卫星数据源(如Sentinel、Landsat、MODIS)的遥感图像,并进行时间序列分析。通过代码示例展示了数据采集模块的实现,包括卫星图像获取和模拟生成功能。该系统可应用于环境要素检测、变化监测等场景,为环境监测提供智

一键难忘的博客 934

Codeforces Round #356 (Div. 1) B

题意: Limak is a little polar bear.它有一个数m(1先减去小于等于当前剩余数的最大的那个三次方数,直道把这个数减成0.现在Limak想知道,给出一个数m,在[1,m]中找到一个数x,使得x在上述拆分条件下,拆出的三次方数最多,同时满足x尽量大 题解: 先不考虑给出的m,如果有两个区间[1,x1],[1,x2],当x1>x2,前一个区间里面的答案无论是在拆

CRZbulabula的博客 537

仿真学习系列(四十三):Sigrity仿真之平面谐振分析

在 SIGRITY 中,平面谐振分析(Plane Resonance Analysis)是一种用于分析信号完整性(SI)问题的高级仿真方法,尤其关注于层间电磁波的传播、谐振现象和信号衰减等问题。平面谐振分析通常用于电源分配网络(PDN)、信号线和参考平面之间的相互作用。本文将详细介绍如何在 SIGRITY 中进行平面谐振分析,并提供一些实用的分析方法与步骤,帮助工程师们识别和优化可能存在的设计问题。

案例文章,高速信号 478

Codeforces 1120 D Power Tree —— 最小生成树

This way 题意: 给你一棵树,让你选择一些点,都有一个权值。每个点你可以对每个点做一次操作:将这个点所属子树的所有叶子结点加上一个值。问你如果想让所有的叶子结点取到任意值,取的点的权值和最小是多少,并且要输出所有可能可以取的点。 题解: 可以看出每个点都有一个管辖的区间,可以转换成为差分问题,然后的话可以将每个点的差分:l到r+1这两个点连条边(虽然我不是很懂为什么突然就可以转换到图上去)...

天翼之城的博客 615

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

CodeForces 1303G - Sum of Prefix Sums(点分治+李超树)

题意 给一颗树,每个点有点权,求树上一条路径u1,u2,...uku_1,u_2,...u_ku1​,u2​,...uk​获得点权数组au1,au2,...auka_{u_1},a_{u_2},...a_{u_k}au1​​,au2​​,...auk​​。要使得它的前缀和的前缀和最大,求这个最大值。 解题思路 树上路径的问题会想到用点分治去解决,以点分治的想法,如何把当前一条路径和现存的路径信息合...

积极的防守者的博客 541

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Codeforces 932F. Escape Through Leaf 李超线段树合并

题解: 这个DP显然可以用李超线段树优化……然后由于每个子树都要求一遍,所以可以直接线段树合并。具体怎么合并应该自己yy一下就可以了。 代码: #include&lt;bits/stdc++.h&gt; using namespace std; #define LL long long #define pa pair&lt;int,int&gt; const int Maxn=10001...

TYB的博客 499

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Codeforces D. 0-1-Tree (树形dp)

https://codeforces.com/contest/1156/problem/D 题意:给你一颗树,同时给每一条边定义一个属性0和1,定义(x,y)表示x到y,其中我们经过1边后不能经过0边,求有多少对(x,y); 做法:本蒟蒻只想得到树形dp的想法,想不到大佬的并查集方法。dp[u][4],分别定义了u和他子树的四种状态。如下图 dp[u][0]表示u的子树中全部是0连在一起的个...

KXL5180的博客 1303

电源完整性基础知识

容值的不同,自谐振频率也不同,电容之间的并联,让其之间有一个新的特性,即阻抗的峰值,称为并联谐振峰值,它发生在并联谐振频率(ParallelResonantFrequency,PRF)处。简单来说,电源的产生与转化,比如Buck电路,LDO,DC-DC等,源端部分这些是电源工程师来确定的。电源路径的不同(层数&Shape宽度等),造成的压降变化是不同的,输出稳定电压到终端的难度很大,我们所要做的只是保证电压的变化在一定的范围之内,也就是所谓的噪声容差。为了使电容器的个数最少,一般选择不同的容值。...

huxyc的博客 882

CF1120D Power Tree(树形DP/构造+差分+最小生成树)

解法一:树形DP 个人觉得这个方法是比较可能想到的,但是输出方案很恶心 先转换题意:“无论怎样规定叶子的初始点权,都可以通过操作你选择的点来让所有叶子的点权清空”意味着每个叶子节点都可以通过一系列操作单独+1、-1 模拟一下就可以发现,以u为根的子树中, 要想通过控制 uuu 或 uuu的祖先(不管是 uuu 还是 uuu的祖先 都同时覆盖了子树内的所有叶子节点) 使子树内所有叶子节点均可以单独+1、-1, 至多一个叶子节点未被覆盖, 且被覆盖的叶子节点一定要可以单独+1、-1 那么状态定义就很显然了: f

Edward The Bunny 的博客 623

线段树 ---- D. Power Tree(离线dfs序+线段树维护树上多条路径和的技巧)

题目链接 题目大意: 一开始给你只有一个点111的树,有qqq次询问。每次询问有两种操作 1  p  v1\;p\;v1pv 就是把最小的没加入的点,加入这个树,它的父亲是ppp,权值是vvv 2  u2\;u2u 就是询问你u的Strength(Su)Strength(S_{u})Strength(Su​)是多少? SuS_uSu​的直接定义是一个集合这个集合包括这个点里面所有的直接儿子的Strength(Sson)Strength(S_{son})Strength(Sson​),和当前点的权值组成

weixin_45630722的博客 362

Codeforces Round #336 (Div. 1) D. Power Tree

D. Power Tree time limit per test 3.5 seconds memory limit per test 256 megabytes input standard input output standard output Genos and Saitama went shopping for Christm

CRZbulabula的博客 1179

[CF607D]Power Tree

题目大意:   一棵树初始只有一个编号为$1$的权值为$w_1$的根。$q(q\le2\times10^5)$次操作,每次可以给出$v,w(w<10^9)$,新建一个结点作为$v$的子结点,权值为$w$;或者给出$u$,求出$f(u)$。定义$f(u)=|S|\cdot\sum_{d\in S}d$,其中$S$为$w_u$与其所有子结点$v$的$f(v)$构成的可重集合。 思路:   首先...

weixin_34419321的博客 525

CF1120D Power Tree [树形DP]

Power Tree原题 好题 大意 给定一棵树,根是1,每个节点有一个价格,现在你的任务是购买一些节点,使得每个(非根的)叶子节点的数值你可以随意操控(数值不是价格)。对于每个你购买的节点,你可以将这个节点的子树的数值统一变化一个整数xxx。 问:最少要花多少钱可以完成任务;哪些点是某个最优方案可能购买到的。 思考过程 玩一下可以发现一个很简单但是对这题没有用 的性质:每个最优方案的买点数等于叶...

C_S_X_的博客 658

Codeforces 607D Power Tree 线段树 (看题解)

Power Tree 没想到一个点到 1 的贡献和到 u 的贡献存在比例关系, 只要乘以 deg[ u ] * m[ u ], m[ u ] 表示 u 到 1, 所成的系数。 然后我们用dfs序建出线段树后, 维护每个点乘的系数, 区间值的和就可以了。 #include<bits/stdc++.h> #define LL long long #define L...

227

CF1120D Power Tree(构造题,差分,最小生成树)

很有趣的一道题。 首先可以对每个叶子进行编号。按照DFS到的顺序即可。(假设从 $1$ 到 $k$) 然后对每个点求出它管辖的所有叶子的编号。因为是DFS序所以这一定是个区间。设点 $u$ 的这个区间是 $[l_u,r_u]$。 区间加操作,考虑差分,那么每个点的操作就变成了 $l_u$ 加一个数,$r_u+1$ 减一个数。(此时也要考虑 $k+1$) 那么题目要求就变成了所有数...

angzuo8655的博客 289

Codeforces - 1120D - Power Tree(差分 + 建图 + 最小生成树)

题目链接:https://codeforces.com/contest/1120/problem/D 3.1 题意 给你一棵有 n(2≤n≤2⋅105)n(2 \le n \le 2 \cdot 10^5)n(2≤n≤2⋅105) 个节点的有根树,根为 111。每个节点 iii 都有一个价格 ci(0≤ci≤109)c_i(0 \le c_i \le 10^9)ci​(0≤ci​≤109)。 Ar...

Nitrogens的博客 415
上一篇: Codeforces Round #446 (Div. 2) E. Envy (并查集)
下一篇: HDU 5917 Instability (Ramsey定理)
Roll_Keyboard
博客等级 码龄9年 10粉丝 128原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值