多校9 1001 hdu 6161 Big binary tree

题意

有一个完全二叉树。编号i的点值是i,操作1是修改一个点的值为x,操作2是查询经过点u的所有路径的路径和最大值。105个点,108次操作。

题解

用map储存修改过的点的值val,和dp[i],表示i子树的最大路径和。

查询就是考虑两种情况,经过u点的两个孩子和经过它的一个孩子再经过它父亲,需要边走到根节点边更新答案。

代码

#include <cstdio>
#include <algorithm>
#include <map>
using namespace std;
#define mem(a,b) memset(a,b,sizeof(a))
typedef long long ll;
const ll mod=1000000007;
const int N=201000;
map<int,ll>dp,val;
int n,m;
char o[10];
ll get(int u){
return val.count(u)?val[u]:u;
}
ll cal(int u){
if(!u||u>n)return 0;
if(dp.count(u))return dp[u];
int v,ls=0,rs=0;
for(v=u;v<=n;++ls,v<<=1);
for(v=u;v<=n;++rs,v=v<<1|1);
if(ls!=rs) v=n;
else v>>=1;
ll ans=0;
for(;v>=u;ans+=v,v>>=1);
return ans;
}
void update(int u,ll x){
val[u]=x;
while(u){
dp[u]=max(cal(u<<1),cal(u<<1|1))+get(u);
u>>=1;
}
}
ll query(int u){
ll ans=get(u)+cal(u<<1)+cal(u<<1|1);
ll tot=cal(u);
while(u){
ans=max(ans,tot+cal(u^1)+get(u>>1));
u>>=1;tot+=get(u);
}
return ans;
}
int main() {
while(~scanf("%d%d",&n,&m)){
dp.clear();val.clear();//又忘记了。。
while(m--){
int u;ll x;
scanf("%s%d",o,&u);
if(o[0]=='q'){
printf("%lld\n",query(u));
}else{
scanf("%lld",&x);
update(u,x);
}
}
}
return 0;
}

最新文章

  1. css3图片模糊过滤效果
  2. springmvc js/css路径问题
  3. MySql数据库索引原理
  4. codeforces Fedor and New Game
  5. C#:使用Hashtable实现输出那些用户发表主题最多的信息
  6. react 不能往组件中传入属性的值为 undefined
  7. 前台页面验证中需要注意的一个与VARCHAR2(N BYTE)和VARCHAR2(N CHAR)的小细节
  8. #ifdef __cplusplus
  9. javascript笔记—— call 简单理解
  10. JQuery 的基本命令
  11. HttpMime 处理 多部件 POST 请求
  12. 直接拿来用!最火的Android开源项目(三部完整版)
  13. Asp.net core 学习笔记 Razor Page
  14. 注解方式过滤器(Filter)不能过滤Servlet的问题
  15. REST与SOA两种架构的异同
  16. 传统DNS的问题与HTTPDNS
  17. webstorm2018版安装-破解
  18. Oracle 12c新特性
  19. Codeforces Beta Round #11 A. Increasing Sequence 贪心
  20. 学习中遇到的c++问题,持续更新

热门文章

  1. PyCharm Debug 调试
  2. c++入门之const初步理解
  3. 广州商学院16级软工一班&amp;二班-第一次作业成绩
  4. pandas数据的分组与分列
  5. 【学习总结】C-翁恺老师-入门-第0周&lt;程序设计与C&gt;
  6. VS2015 + OPENCV + CUDA 安装流程
  7. Java Hash集合的equals()与hashCode() 方法
  8. java lang(Thread) 和 Runable接口
  9. Azure系列2.1 —— com.microsoft.azure.storage.blob
  10. 剑指offer(12)