题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6161

题意:

题目是给一棵完全二叉树,从上到下从左到右给每个节点标号,每个点有权值,初始权值为其标号,然后有两种操作:
1、把u点权值改为x
2、查询所有经过u点的路径中,路径上的点权和最大。
节点有n个,修改有m个,n<=1e8 ,m<= 1e5

解法:现场队友过的,orz,来自队友的思路。

我们首先对于一个点,如果没有访问我们不把它建出来,相反访问了就把它建出来,这个题的最小的子问题就是计算一个节点的答案怎么算,我们直接往右子树怼?显然并不全是,我们发现从n上来这一条链上的节点的答案并不一定是一直往右走,所以我们特殊处理这条链就可以 了。这就解决了最小的子问题,用log2n的复杂度算出了每个节点的答案,接下来就是更新和查询,更新的话,我们先更新这个节点,然后从这个节点到1这条链上的点都要更新,我们直接更新上去即可,对于查询来说,和更新一样我们只需要关心这个点所在的链上的信息,所以我们直接往上跑并且查询,这里查询就要贪心一下,如果有左儿子就累加上靠右儿子的答案,否则累加左儿子的答案,这里画个图模拟一下即可,这些点的信息可以用unorder_map和unorder_set来方便的维护,复杂度O(logn*logn)。

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
unordered_map<int,pair<LL,LL> >mp;//u点,左儿子,右儿子
unordered_map<int,LL>now;//现在这个u节点的值
unordered_set<int>st;//题解上说的那条特殊链
int n,m;
LL cal(int u){
if(u>n) return 0;
if(mp.count(u)){
auto p=mp[u];
return max(p.first,p.second);
}
if(st.count(u)){
int v1=u*2;
int v2=u*2+1;
if(st.count(v1)) return u+cal(v1);
else return u+cal(v2);
}
return u+cal(u*2+1);
}
void init(){
mp.clear();
st.clear();
int t=n;
do{
st.insert(t);
t/=2;
}while(t);
}
void update(int u, LL val){
if(mp.count(u)==0){
mp.emplace(u, make_pair(cal(u*2)+u,cal(u*2+1)+u));
now[u]=u;
}
auto &p=mp[u];
p.first+=val-now[u];
p.second+=val-now[u];
now[u]=val;
int t=u;
u/=2;
while(u){
if(mp.count(u)==0){
mp.emplace(u, make_pair(cal(u*2)+u,cal(u*2+1)+u));
now[u]=u;
}
else{
auto &p2=mp[u];
if(u*2==t){
p2.first=now[u]+cal(u*2);
}
else{
p2.second=now[u]+cal(u*2+1);
}
}
u/=2;
t/=2;
}
}
LL query(int u){
LL ans=0;
if(mp.count(u)==0){
mp.emplace(u,make_pair(u+cal(u*2),u+cal(u*2+1)));
now[u]=u;
}
auto &p=mp[u];
ans = p.first+p.second-now[u];
LL len = max(p.first, p.second);
int t=u;
u/=2;
while(u){
if(mp.count(u)==0){
mp.emplace(u,make_pair(cal(u*2)+u,cal(u*2+1)+u));
now[u]=u;
}
auto &p=mp[u];
if(u*2==t){
ans=max(ans,p.second+len);
}
else{
ans=max(ans,p.first+len);
}
len+=now[u];
t/=2;
u/=2;
}
return ans;
}
int main()
{
while(~scanf("%d%d", &n,&m))
{
init();
for(int i=1; i<=m; i++){
char op[10];
scanf("%s", op);
if(op[0] == 'q'){
int x;
scanf("%d", &x);
printf("%lld\n", query(x));
}
else{
int x;
LL y;
scanf("%d%lld", &x,&y);
update(x,y);
}
}
}
return 0;
}

2017多校第9场 HDU 6161 Big binary tree 思维,类似字典树的更多相关文章

  1. 2017多校第7场 HDU 6121 Build a tree K叉树,思维

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6121 题意:一个n个点的完全k叉树,求每个节点的size的异或和. 解法:容易发现,考虑根的所有孩子, ...

  2. 2017 Multi-University Training Contest - Team 9 1001&&HDU 6161 Big binary tree【树形dp+hash】

    Big binary tree Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)T ...

  3. HDU 6161.Big binary tree 二叉树

    Big binary tree Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)T ...

  4. 2017多校第9场 HDU 6170 Two strings DP

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6170 题意:给了2个字符串,其中第2个字符串包含.和*两种特别字符,问第二个字符串能否和第一个匹配. ...

  5. 2017多校第9场 HDU 6169 Senior PanⅡ 数论,DP,爆搜

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6169 题意:给了区间L,R,求[L,R]区间所有满足其最小质数因子为k的数的和. 解法: 我看了这篇b ...

  6. 2017多校第10场 HDU 6181 Two Paths 次短路

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6181 题意:给一个图,求出次短路. 解法:我之前的模板不能解决这种图,就是最短路和次短路相等的情况,证 ...

  7. 2017多校第10场 HDU 6180 Schedule 贪心,multiset

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6180 题意:给了一些任务的开始时间和终止时间,现在让我们安排k台及机器,让这些任务在k太机器上最小,并 ...

  8. 2017多校第10场 HDU 6178 Monkeys 贪心,或者DP

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6178 题意:给出一棵有n个节点的树,现在需要你把k只猴子放在节点上,每个节点最多放一只猴子,且要求每只 ...

  9. 2017多校第10场 HDU 6171 Admiral 双向BFS或者A*搜索

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6171 题意: 给你一个高度为6的塔形数组,你每次只能将0与他上下相邻的某个数交换,问最少交换多少次可以 ...

随机推荐

  1. 读书共享 Primer Plus C-part 8

    第十三章 文件输入/输出 fopen--fclose fopen 是文件的操作的开始 fclose是文件操作的结束 getc--putc getchar--putchar getc对应文件的获取单个字 ...

  2. Tomcat7安装(linux环境)

    1.获取安装包 如果没有tomcat,则创建之,并下载二进制文件到该目录,如下: mkdir /opt/tomcat cd /opt/tomcat wget http://mirrors.hust.e ...

  3. 如何快速轻松学习bootstrap

    我以前也是通过看一些视频教程来学的,比如慕课网上的,比如51cto上的那些零基础入门bootstrap什么的,还有一些培训班里流传出来的,感觉晕乎乎的,不知所云. 还是在后面不断使用的过程中慢慢体会到 ...

  4. 阿里云VPC绑定EIP实现SNAT

    阿里云VPC需要了解的几个问题 什么是VPC 虚拟私有网络(Virtual Private Network),能够帮助用户基于阿里云构建出一个隔离的网络环境.用户可以完全掌控自己的虚拟网络,包括选择自 ...

  5. Selenium webdriver定位iframe里面元素两种方法

    以东方财富网登录页面为例: 在查找元素过程中,直接通过id或者xpath等找不到元素,查看页面源代码发现元素是属于iframe里,例如: <div class="wrap_login& ...

  6. Ubuntu tty中文字符乱码

    默认的tty只能显示一个字节,我们可以用setfont命令去改tty字体,但仅仅局限在一个字节内,不支持UTF-8多字节,所以我们就没办法使用汉字.但是我们可以使用FbTerm啊!FbTerm是支持中 ...

  7. background:rgba() 兼容ie8 用法

    background: rgba(255,255,255,.1);//火狐,谷歌等 filter:progid:DXImageTransform.Microsoft.gradient(startCol ...

  8. POJ 2566 尺取法(进阶题)

    Bound Found Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 4297   Accepted: 1351   Spe ...

  9. HDU-4787 GRE Words Revenge 解题报告

    这是我之前博客里提到的一道AC自动机的练手题,但是要完成这道题,我之前博客里提到的东西还不够,这里总结一下这道题. 这道题不是一般的裸的AC自动机,它的询问和插入是交叉出现的所以用我之前写的板子不大合 ...

  10. vue使用之剑走偏锋——菜单组件篇

    背景 习惯了这样的写法了,上来先来一个背景,交待一下事情的起因.事情的起因很简单,用惯了mvc框架,想来一发前后端完全分离的框架试试.选用的人员和技术是这样子的,让原本做java的web开发的人员使用 ...