HDU 3966 Aragorn's Story(树链剖分)

【HDU】3966 Aragorn's Story(树链剖分+线段树) 树链剖分的模板题,思路就不说了, 等做了一些题目之后,在写个总结吧。 先说一下这道题错误的地方。 1、爆栈。看大神的博客才找到解决的方法。 说是hdu的oj是window的系统,容易爆栈 所以在之前应该要手动扩栈。 在代码之前加上:#pragma comment(linker, "/STACK:1024000000,1024000000")就可以了。 2、 是在路径的缩短中写错了。 阅读详情

题意:

给你一棵树,n个节点,每个节点有一个val,p次操作,一种是每次对u到v加或者减一个数,另一种是查询某个点的值

思路:

树链剖分水题,简单地维护一下就好。但是,这题真正坑的地方是MLE,看到discuss里面,很多人反映G++会出问题但是C++能AC,有人说因为hdu是windows会容易爆栈,需要手动扩栈。我经过血的教训,得出结论,如果这些都没有问题,请看看自己写的数组到底有没有问题,比如lazy有没有开四倍,链式前向星有没有开两倍等等,我因为lazy忘了开四倍红了一页。。。真是让人智熄

错误及反思:

吐槽一下,这题vector比链式前向星块很多

代码:

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
const int N =50100;
int segtree[N*4];
int lazy[N*4];
int top[N],son[N],first[N],fa[N],id[N],val[N],depth[N],si[N];
vector<int> v[N];
int arr[N];
int n,m,q,tot=0,tid=0;


void build(int l,int r,int rt)
{
    if(l==r)
    {
        segtree[rt]=arr[l];
        return ;
    }
    int m=(l+r)/2;
    build(lson);
    build(rson);
    segtree[rt]=segtree[rt<<1]+segtree[rt<<1|1];
}
void dfs1(int now,int bef,int dep)
{
    depth[now]=dep;
    fa[now]=bef;
    si[now]=1;
    for(int i=0;i<v[now].size();i++)
        if(v[now][i]!=bef)
        {
            dfs1(v[now][i],now,dep+1);
            si[now]+=si[v[now][i]];
            if(son[now]==-1) son[now]=v[now][i];
            else son[now]=si[v[now][i]]>si[son[now]]?v[now][i]:son[now];
        }
}
void dfs2(int now,int tp)
{
    top[now]=tp;
    id[now]=tid++;
    if(son[now]!=-1) dfs2(son[now],tp);
    for(int i=0;i<v[now].size();i++)
        if(v[now][i]!=fa[now]&&v[now][i]!=son[now])
            dfs2(v[now][i],v[now][i]);
}
void pushdown(int l,int r,int rt)
{
    if(lazy[rt])
    {
        int m=(l+r)/2;
        lazy[rt<<1]+=lazy[rt];
        lazy[rt<<1|1]+=lazy[rt];
        segtree[rt<<1]+=lazy[rt]*(m-l+1);
        segtree[rt<<1|1]+=lazy[rt]*(r-m);
        lazy[rt]=0;
    }
}
void change(int L,int R,int v,int l,int r,int rt)
{
    if(L<=l&&R>=r)
    {
        lazy[rt]+=v;
        segtree[rt]+=v*(r-l+1);
        return ;
    }
    pushdown(l,r,rt);
    int m=(l+r)/2;
    if(m>=L) change(L,R,v,lson);
    if(m<R) change(L,R,v,rson);
    segtree[rt]=segtree[rt<<1]+segtree[rt<<1|1];
}
int query(int pos,int l,int r,int rt)
{
    if(l==r&&l==pos)
        return segtree[rt];
    pushdown(l,r,rt);
    int m=(l+r)/2;
    if(m>=pos) return query(pos,lson);
    return query(pos,rson);
}
void modify(int L,int R,int v)
{
    int f1=top[L],f2=top[R];
    while(f1!=f2)
    {
        if(depth[f1]<depth[f2])
        {
            swap(f1,f2);
            swap(L,R);
        }
        change(id[f1],id[L],v,0,tid-1,1);
        L=fa[f1];
        f1=top[L];
    }
    if(L==R)
    {
        change(id[L],id[R],v,0,tid-1,1);
        return;
    }
    else{
        if(depth[L]<depth[R]) swap(L,R);
        change(id[R],id[L],v,0,tid-1,1);
    }
}
int main()
{
    while(~scanf("%d%d%d",&n,&m,&q))
    {
        tid=0;
        memset(lazy,0,sizeof(lazy));
        memset(son,-1,sizeof(son));
        memset(first,-1,sizeof(first));
        memset(segtree,0,sizeof(segtree));
        for(int i=1;i<=n;i++)
            scanf("%d",&val[i]);
        for(int i=0;i<n-1;i++)
        {
            int ta,tb;
            scanf("%d%d",&ta,&tb);
            v[ta].push_back(tb);
            v[tb].push_back(ta);
        }
        dfs1(1,0,1);
        dfs2(1,1);
        for(int i=1;i<=n;i++)
            arr[id[i]]=val[i];
        build(0,tid-1,1);
        while(q--)
        {
            char temp[10];
            int ta,tb,tc;
            scanf("%s",temp);
            if(temp[0]=='Q')
            {
                scanf("%d",&ta);
                printf("%d\n",query(id[ta],0,tid-1,1));
            }
            else
            {
                scanf("%d%d%d",&ta,&tb,&tc);
                if(temp[0]=='D')
                    tc=-tc;
                modify(ta,tb,tc);
            }
        }
        for(int i=1;i<=n;i++) v[i].clear();

    }
}
Vmware Vcenter7.0证书web续期发生错误 生成证书,选择第三个(PS,如果没有域名的,一定要写IP,不然很容易卡在85%,服务不能起来)这里大概率可能是证书里面的FQDN和主机不匹配,又或者是主机解析FQDN有问题。vCenter _MACHINE_CERT快到期了,通过web界面更新证书失败。vSphere Client 版本 7.0.2.00200。登陆ssh到vcenter,重新生成证书。先关掉HA,不然证书管理会报错。第一步先这样,重新续订一下证书。 阅读详情

相关推荐

【Docker】从零构建达梦DM8轻量级服务镜像:实战与优化

本文详细介绍了从零开始构建达梦DM8轻量级Docker镜像的完整实战流程。通过分析传统安装方式的痛点,阐述了使用Docker封装数据库的优势,并重点讲解了如何利用静默安装、精简组件、多阶段构建等优化技巧,打造一个体积小巧、启动迅速、配置灵活的DM8服务镜像,助力实现开发、测试与部署的环境一致性与高效性。

ooo22的博客 518

HDU 3966 Aragorn's Story(树链剖分+线段树)

Description 给一棵树,并给定各个点权的值,然后有3种操作 I C1 C2 K: 把C1与C2的路径上的所有点权值加上K D C1 C2 K:把C1与C2的路径上的所有点权值减去K Q C:查询节点编号为C的权值 Input 第一行为三个整数n,m和q分别表示点数,边数以及操作数,第二行n个整数表示n个节点的权值,之后m行每行两个整数a和b表示a和b之间有一条无向边,最后q行每

ZSQ 703

Pi0 项目复现及项目问题解决方案(全网抢先发布~)

Pi0 项目复现及项目问题解决方案(全网抢先发布~)

m0_68167062的博客 2261

[HDU3966]Aragorn's Story 做题笔记

·· / ·– ·· ·-·· ·-·· / ·–· · ·-· ··· ·· ··· - / ··- -· - ·· ·-·· / ·· / ·– ·· -· 题目来源:http://acm.hdu.edu.cn/showproblem.php?pid=39661、打懒标记的时候一定要注意懒标记是否可以累加,或者是否应该异或 2、多组测试数据。。。 3、线段树针对多组数据的初始化不要忘了#i

mhlwsk的博客 465

MATLAB R2022b 安装教程

1. 下载安装先放资源链接,百度网盘太贵了不想续了,换了夸克网盘。1. 下载安装。

qq_51654158的博客 2万+

光伏发电系统模拟及其发电预测开源python工具pvlib

本文介绍光伏发电系统模拟及其发电预测开源python工具pvlib,以及举例介绍获取辐照度方法、光伏发电预测思路。

肖永威的专栏 1万+

【HDU3966】Aragorn's Story-树链剖分或LCT维护路径

【HDU3966】Aragorn's Story-树链剖分或LCT维护路径

Maxwei_wzj的OI世界 484

XDMA流传输模式

XDMA 流传输模式(Streaming DMA)​ 是 Xilinx FPGA 通过 PCIe 与主机进行 ​实时流式数据传输 的核心机制,

浩瀚之水的专栏 3433

HDU3966 Aragorn's Story 树链剖分

裸地不能在裸的树链剖分了,col忘记清空,狂wa一小时。 本来想学LINK CUT TREE的,考试接踵,做题状态全无。== ==暂时顺延了 Aragorn's Story Time Limit: 10000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submis

1200

如何配置SSC CANopen的excel文件

如何配置 CANOpen 的 EXCEL 文件

PI_sunyang的博客 3696

使用node-red网关读取modbus设备点表,并上传到市政低碳平台来统计数据

最近做了一个物联网项目,具体是这样的,利用node-red网关盒子,来采集Modbus设备的点表,然后将数据转换,封装,最终上传到市政的低碳平台。上一步封装了点表的数据,调用低碳平台还需要账号密码,建筑id,这些都是固定信息,所以我们单独提出来。上一步获取到了原始的点表数据,下一步就是将这些点表数据与在低碳平台创建的采集的对应起来,并且设置好分类。读取modbus的节点,会有两个输出,我是使用的第一个输出。msg.meters 是一个数组,里面的每一个元素都是一个点表,比如厨房用水,园区照明,

知无涯 946

hdu 3966 Aragorn's Story 树链剖分

#pragma comment(linker,"/STACK:100000000,100000000") #include #include #include #include #include using namespace std; #define maxn 70007 #define lc u<<1 #define rc u<<1|1 #define ll long long struct

G.D.Retop的专栏 773

SpringBoot实战教程-springboot概论

Spring Boot 是一个快速开发框架,能够快速的整合第三方框架,简化XML配置,全部采用注解形式,以及自动配置。内置web容器,帮助开发者能够实现快速开发,简化了应用系统的初始搭建以及开发过程。

鸟哥哥的专栏 4155

hdu3966 Aragorn's Story 树链剖分

题意:n个点构成的树,每个点都有一个权值。有三种操作: 1. I  a b  k 使a到b路径中所有点的点权增加k 2.  D a b k 使a到b路径中的 所有点的点权减去k  3. Q  c 查询点c的权值。 思路:树链剖分。剖分后,成段更新,单点查询,详见代码: /*********************************************************

AC_kereo的专栏 869

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

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

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

树链剖分+线段树 hdu3966 Aragorn's Story

传送门:点击打开链接 题意:路径更新,单点查询 思路:线段树+树链剖分,这里其实不需要懒惰标记也是可以做的 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define fuck(x) c

qwb的博客 956

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

HDU 3966 Aragorn's Story 树链剖分

题目大意: 就是现在给出一棵树节点个数不超过50000, 每个节点初始有个权值 接下来最多10万次操作, 每次操作对于节点u和v之间路径上的所有点的权值加上一个值或者减去一个值 或者询问某个节点当前的权值是多少 大致思路: 学习树链剖分的第一个题目.... 首先将树剖分之后映射到线段树维护的区间中, 然后就是区间修改单点查询的线段树问题了 代码如下: Result

Gatevin的专栏 547

Devexpress16.2.6破解工具

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

HDU - 3966 Aragorn's Story(树链剖分)

题目传送门:HDU - 3966 Aragorn's Story 题目大意: 存在一个树,树上每个节点为一个阵营,阵营中存在敌人,现在要进行以下操作 I C1 C2 K :将阵营C1到阵营C2路径经过的每个阵营的人数+k D C1 C2 K :将阵营C1到阵营C2路径经过的每个阵营的人数-k Q C:查询阵营C中的人数。 分析: 点权树链剖分,线段树维护区间和即可,单...

weixin_33971205的博客 84

HDU 3966 Aragorn's Story (树链剖分)

题目地址:HDU 3966 树链剖分模板题。不多说、、 代码如下:#include <iostream> #include <string.h> #include <math.h> #include <queue> #include <algorithm> #include <stdlib.h> #include <map> #include <set> #include <stdio.h> u

scf0920 1314

[hdu 3966 Aragorn's Story] 点权树链剖分

[hdu 3966 Aragorn’s Story] 点权树链剖分题目链接:[hdu 3966 Aragorn’s Story] 题意描述: 给定一个NN个点的树,以及树上的点对应的初始权值。接下来有PP次操作,操作一:将顶点uu到顶点vv的路径上的所有点权±x±x,操作二:求顶点uu上的权值。 解题思路:点权的树链剖分以及区间更新和单点求值。/**********************

Fighting! 722

【HDU】3966 Aragorn's Story 树链剖分

传送门:【HDU】3966 Aragorn's Story

poursoul 751

HDU 3966 Aragorn's Story 树链剖分模板

题目:http://acm.hdu.edu.cn/showproblem.php?pid=3966 题解: #include #include #include #include using namespace std; #define MAXN 50010 #define L(u) (u<<1) #define R(u) (u<<1|1) //写在类里面爆栈 int n, m, q; i

3979

hdu_3966_Aragorn's Story(树链剖分裸题)

题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=3966 题意:给你一棵树,然后给定点之间的路径权值修改,最后单点查询 题解:树链剖分裸题,这里我用树状数组维护 #include #pragma comment(linker, "/STACK:1024000000,1024000000") #define F(i,a,b) for(int

bin_gege的博客 537

HDU 3966 Aragorn's Story(树链剖分)

题意:给一棵树,并给定各个点权的值,然后有3种操作: I C1 C2 K : 把 C1 与 C2 的路径上的所有点权值加上 K D C1 C2 K:把 C1 与 C2 的路径上的所有点权值减去 K Q C:查询节点编号为C的权值。 思路:树链剖分.............一开始线段树写sb了wa了一下午.............正好又练习了一下线段树........ #includ

GODSPEED 356
上一篇: BZOJ 1036 树的统计Count(树链剖分)
下一篇: POJ 2763 Housewife Wind (树链剖分)
Roll_Keyboard
博客等级 码龄9年 10粉丝 128原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值