HDU 3966-Aragorn's Story 树链剖分+树状数组

题目链接


题意:有一棵树,每个节点有权值
有三种操作:

  • I c1 c2 k 从节点c1到节点c2的路径上每个节点权值增加k
  • D c1 c2 k 从节点c1到节点c2的路径上每个节点权值减少k
  • Q i 查询节点i的权值是多少

思路:

  • 树链剖分处理出来的链放在数组中,使用树状数组维护
  • 树状数组进行区间修改,单点查询

树状数组区间修改,单点查询的方法:链接


#include <stdio.h>
#include <iostream>
#include <string.h>
#include <stdlib.h>
#include <vector>
#include <algorithm>
#include <queue>
#include <map>
#include <stack>
#include <string>
#include <math.h>
#include <bitset>
#include <ctype.h>
#define CLR(n,b) memset(n, b, sizeof(n))
using namespace std;
typedef pair<int,int> P;
typedef long long LL;
const int INF = 0x3f3f3f3f;
const double PI = acos(-1.0);
const double eps = 1e-9;
const int N = 6e4 + 5;
const int mod = 1e9 + 7;
struct Edge
{int u,v;Edge() {}Edge(int a, int b): u(a), v(b) {}
};
int fa[N],son[N], p[N],fp[N], top[N],dep[N],sz[N];
int pos;
int n,m,k;
vector<Edge> edges;
vector<int> G[N];
void init(int n)
{CLR(fa, 0);  CLR(son, -1); CLR(p, -1);CLR(fp, -1); CLR(top, 0); CLR(sz, 0); CLR(dep, 0);pos = 0; edges.clear();for(int i = 0; i <= n; i++) G[i].clear();
}
void addedge(int u, int v)
{edges.push_back(Edge(u,v));edges.push_back(Edge(v,u));int m = edges.size();G[u].push_back(m-2);G[v].push_back(m-1);
}// 树链剖分void dfs(int u, int pre, int d)
{fa[u] = pre;dep[u] = d;sz[u] = 1;son[u] = -1;for(int i = 0; i < G[u].size(); i++){Edge &e = edges[G[u][i]];int v = e.v;if(v == pre) continue;dfs(v, u, d+1);sz[u] += sz[v];if(son[u] == -1 || sz[son[u]] < sz[v])son[u] = v;}
}void getpos(int u, int sp)
{top[u] = sp;p[u] = ++pos;fp[p[u]] = u;if(son[u] == -1) return;getpos(son[u], sp);for(int i = 0; i < G[u].size(); i++){Edge &e = edges[G[u][i]];int v = e.v;if(v == son[u] || v == fa[u]) continue;getpos(v, v);}
}// 树状数组
int c[N];
inline int lowbit(int x)
{return x&(-x);
}
void add(int x, int val)
{while(x <= n){c[x] += val;x += lowbit(x);}
}
int sum(int x)
{int ans = 0;while(x){ans += c[x];x -= lowbit(x);}return ans;
}// change
void change(int x, int y, int val)
{int u = x, v = y;int f1 = top[u], f2 = top[v];while(f1 != f2){if(dep[f1] < dep[f2]){swap(f1,f2);swap(u,v);}add(p[f1], val);add(p[u]+1, -val);u = fa[f1];f1 =top[u];}if(dep[u] > dep[v]) swap(u,v);add(p[u], val);add(p[v]+1, -val);
}int a[N];
int main()
{while(~scanf("%d%d%d", &n, &m, &k)){init(n);for(int i = 1; i <= n; i++){scanf("%d", &a[i]);}for(int i = 0; i < m; i++){int u,v;scanf("%d%d", &u, &v);addedge(u,v);}dfs(1,1,0);getpos(1,1);memset(c, 0, sizeof(c));for(int i = 1; i <= n; i++){add(p[i], a[i]);add(p[i]+1, -a[i]);}while(k--){char cmd[10];int x,y,z;scanf("%s", cmd);if(cmd[0] == 'Q'){scanf("%d", &x);printf("%d\n", sum(p[x]));}else{scanf("%d%d%d", &x,&y,&z);if(cmd[0] == 'D')z = -z;change(x,y,z);}}}return 0;
}

转载于:https://www.cnblogs.com/Alruddy/p/7492307.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/251885.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Filter介绍

Filter 可认为是 Servlet的一种 “ 加强版 ”&#xff0c;它主要用于对用户请求进行预处理&#xff0c; 也可以对HttpServletResponse 进行后处理&#xff0c;是个典型的处理链。Filter 也可对用户请求生成响应&#xff0c;这一 点与Servlet 相同&#xff0c; 但实际上很少会使…

LeetCode算法题-Jewels and Stones(Java实现)

这是悦乐书的第313次更新&#xff0c;第334篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第182题&#xff08;顺位题号是771&#xff09;。字符串J代表珠宝&#xff0c;S代表你拥有的石头。S中的每个字符都是你拥有的一种石头。计算S中有多少石头也是珠宝。J中…

python --- 二分查找算法

二分查找法&#xff1a;在我的理解中这个查找方法为什么会叫二分呢&#xff0c;我认为是将要查询的一个列表分成了两份&#xff0c;然后在利用某个值来进行比较&#xff0c;在一个不断循环的过程中来找出我们要找的某一个值。 废话不多说&#xff0c;先上代码&#xff1a; 1 de…

面试题

1. block 的作用由来&#xff0c;跟delegate的区别。 2. swift 的枚举。 3. iOS保存一个对象。转载于:https://www.cnblogs.com/studyNT/p/7499779.html

ssm框架下文件上传

springmvc实现文件上传的步骤&#xff1a; 1.页面上&#xff0c;通过input来准备file组件&#xff0c;该标签&#xff0c;必须给定name属性值 同时&#xff0c;要求form表单必须给定一个属性&#xff1a;enctype"multipart/form-data" 2.在pom.xml文件中&#xff0c;…

MySQL via EF6 的试用报告

MySQL via EF6 的试用报告1、如何通过 EF6 来连接 MySQL&#xff1f;2、如何通过 EF6 来实现 CRUD&#xff1f;2.1、Create 添加2.2、Retrieve 查询2.3、Update 修改2.4、Delete 删除3、如何更好的运用 EF6 来完成工作&#xff1f;3.1、传说中 EF 的三种模式3.2、EF6 执行原生 …

Java暑假作业

一.《大护法》观影有感 ... 从预告开始就期待着这部影片&#xff0c;在看过一遍后又忍不住二刷&#xff0c;影片观看至第二遍后&#xff0c;对于全片的脉络也更清晰了一点&#xff0c;虽然打着暴力美学的旗子&#xff0c;但《大护法》偏偏更文艺一些。文艺片是没有对错的&a…

使用EasyNetQ组件操作RabbitMQ消息队列服务

RabbitMQ是一个由erlang开发的AMQP(Advanved Message Queue)的开源实现&#xff0c;是实现消息队列应用的一个中间件&#xff0c;消息队列中间件是分布式系统中重要的组件&#xff0c;主要解决应用耦合&#xff0c;异步消息&#xff0c;流量削锋等问题。实现高性能&#xff0c;…

context-param和init-param的区别

http://www.cnblogs.com/hzj-/articles/1689836.html 转载于:https://www.cnblogs.com/wangc04/p/7501054.html

TensorFlow 1.12.2 发布,修复 GIF 构造安全漏洞

开发四年只会写业务代码&#xff0c;分布式高并发都不会还做程序员&#xff1f; TensorFlow 1.12.2 发布了&#xff0c;此处本修复了一个潜在的安全漏洞&#xff1a; 精心设计的 GIF 图像可以在解码过程中产生空指针解引用更新说明&#xff1a; https://github.com/tensorflo…

【教程】如何在标签打印工具TFORMer Designer中自定义布局?

TEC-IT的在线标签生成器TFORMer Designer提供标签打印服务&#xff0c;并提供即用型行业标签模板作为Web服务。使用此软件&#xff0c;您可以在几秒钟内创建您自己的标签和表格或在工业和物流业中使用即时可用的模板。TFORMer Designer的最新更新现在允许使用自定义标签布局。 …

对象变为指定格式的数组

拿到的对象的格式&#xff08;一个对象里面都好多属性&#xff09; 想要转换成的数据格式&#xff08;一个数组里面有好多个对象&#xff0c;每个对象有一个id和name的属性&#xff09; 如何处理的 selectionChange(val) { // 列表选择var dynamicTags1 [];var arr[]for(var i…

bootstrapValidator remote 验证问题

1 加载jQuery和bootstrap.min.js 后引入bootstrapValidator.min.js字段验证之remote 远程验证(类似ajax验证)&#xff0c;返回值必须是 {"valid":true}{"valid":false} true表示 验证通过 false 表示验证不通过。 当添加remote 验证后&#xff0c;验证通过…

世界顶级的程序员们告诉你:这些书都是你应该读的

在很早之前就想整理一份来自经验丰富的顶级程序员推荐阅读的书籍清单&#xff0c;全栈工程师Dmitry Shvetsov整理了Bob叔以及Jeff Atwood and DHH等世界知名程序员曾经在博客中推荐过的书单&#xff0c;下面我们就一起来看看深受大神们青睐的书籍都是哪些?世界顶级的程序员们告…

《20170911-构建之法:现代软件工程-阅读笔记》

第一章&#xff1a; 介绍软件工程和软件的关系&#xff0c;软件程序软件工程。 软件工程是把系统的、有序的、可量化的方法应用到软件的开发、运营和维护上的过程。 计算机科学这一学术领域可以分为以下这些偏理论的领域&#xff1a; 1.计算机理论 2.信息和编码理论 3.算法和数…

mysql学习(2)索引的本质

2019独角兽企业重金招聘Python工程师标准>>> 问题&#xff1a;SQL查询慢怎么办&#xff1f; 优化手段&#xff0c;加索引。 索引是帮助MYSQL高效的获取数据的排好序的数据结构。 问题&#xff1a;索引结构为什么使用Btree而不使用二叉树&#xff0c;红黑树或者HASH结…

bzoj4245: [ONTAK2015]OR-XOR

一道很有意思的题目。 先求一次前缀和&#xff0c;可以发现答案是 (sum[0] xor sum[x1])or(sum[x1] xor sum[x2])or(sum[x2] xor sum[x3])or……or(sum[m-1] xor sum[n]) 然后其实&#xff08;a xor b&#xff09;or b a or b 那么sum[0]0,可以把柿子变成 sum[x1] or sum[x2] o…

移动端常见的一些兼容性问题

1、安卓浏览器看背景图片&#xff0c;有些设备会模糊。 是devicePixelRatio作怪&#xff0c;因为手机分辨率太小&#xff0c;如果按照分辨率来显示网页&#xff0c;这样字会非常小&#xff0c;所以苹果当初就把iPhone 4的960*640分辨率&#xff0c;在网页里只显示了480*320&…

go-变量

这次我们学习一下golang语言 gitee: go-study 定义 定义的变量或者函数必须用到(pakeage内的全局除外) var a int // 默认为0 var b string //默认为"" fmt.Printf("%d %q\n",a, s) 复制代码直接定义可以不写类型(int..)go会自行判断 var a, b 3, 4 var …

CSS3:CSS3 文本效果

ylbtech-CSS3&#xff1a;CSS3 文本效果1.返回顶部 1、CSS3 文本效果 CSS3 文本效果 CSS3中包含几个新的文本特征。 在本章中您将了解以下文本属性&#xff1a; text-shadowbox-shadowtext-overflowword-wrapword-break浏览器支持 属性 text-shadow4.010.03.54.09.5box-sha…