博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
2017 Multi-University Training Contest - Team 9 1001&&HDU 6161 Big binary tree【树形dp+hash】
阅读量:6450 次
发布时间:2019-06-23

本文共 3091 字,大约阅读时间需要 10 分钟。

Big binary tree

Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)

Total Submission(s): 597    Accepted Submission(s): 207

Problem Description
You are given a complete binary tree with n nodes. The root node is numbered 1, and node x's father node is
x/2. At the beginning, node x has a value of exactly x. We define the value of a path as the sum of all nodes it passes(including two ends, or one if the path only has one node). Now there are two kinds of operations:
1.  change u x Set node u's value as x(1≤u≤n;1≤x≤10^10)
2.  query u Query the max value of all paths which passes node u.
 

 

Input
There are multiple cases.
For each case:
The first line contains two integers n,m(1≤n≤10^8,1≤m≤10^5), which represent the size of the tree and the number of operations, respectively.
Then m lines follows. Each line is an operation with syntax described above.
 

 

Output
For each query operation, output an integer in one line, indicating the max value of all paths which passes the specific node.
 

 

Sample Input
6 13query 1query 2query 3query 4query 5query 6change 6 1query 1query 2query 3query 4query 5query 6

 

Sample Output
171717161717121212111212

 

Source
题目链接:
分析:考虑dp,f(x)表示从点x开始向下走得到的最大的点权和,查询直接从x开始向上走更新答案即可。
考虑快速算 f(x) 对于子树内没有被修改过的点的 f(x) 可以快速分类讨论算出,而不满足本条件的点只有 O(mlogm) 个,在hash上dp即可。
下面给出AC代码:
1 #include
2 using namespace std; 3 #define pb push_back 4 #define mkp make_pair 5 #define fi first 6 #define se second 7 #define ll long long 8 #define M 1000000007 9 #define all(a) a.begin(), a.end()10 11 int n, m;12 char s[20];13 map
mp;14 map
amp;15 16 inline ll askmax(int u){17 if(u > n) return 0;18 if(mp.count(u)) return mp[u];19 else{20 int l = u, r = u;21 while(l * 2 <= n){22 l <<= 1;23 r = (r << 1) | 1;24 }25 r = min(r, n);26 ll res = 0;27 while(r >= u) res += r, r >>= 1;28 return res;29 }30 }31 32 inline int ask(int x){33 return amp.count(x) ? amp[x] : x;34 }35 36 int main(){37 while(~scanf("%d%d", &n, &m)){38 mp.clear();39 amp.clear();40 while(m--){41 int x, v;42 scanf("%s", s);43 if(s[0] == 'c'){44 scanf("%d%d", &x, &v);45 amp[x] = v;46 for(; x; x >>= 1)47 mp[x] = max(askmax(x << 1), askmax((x << 1) | 1)) + ask(x);48 }else{49 scanf("%d", &x);50 int px = x;51 ll res = 0, now = 0;52 for(; x >> 1;){53 bool k = ~x & 1; x >>= 1;54 now += ask(x);55 ll tmp = askmax(x << 1 | k);56 if(now + tmp > res) res = now + tmp;57 }58 res += askmax(px);59 res = max(res, askmax(px << 1) + askmax(px << 1 | 1) + ask(px));60 printf("%lld\n", res);61 }62 }63 }64 65 #ifndef ONLINE_JUDGE66 system("pause");67 #endif68 return 0;69 }

 

转载地址:http://jylwo.baihongyu.com/

你可能感兴趣的文章
常用DOS命令
查看>>
能上QQ上不了网的解决办法
查看>>
flask + Python3 实现的的API自动化测试平台---- IAPTest接口测试平台
查看>>
【翻译】将Ext JS Grid转换为Excel表格
查看>>
关于人工智能的几个问题
查看>>
个人阅读作业2
查看>>
解决百度上传WebUploader在IE浏览器下点击无反应的问题
查看>>
Oracle常用函数 - 字符函数
查看>>
Linux shell脚本的字符串截取
查看>>
Zendstudio导入项目报错:overlaps the location of another
查看>>
Shell 标准输入、输出和错误
查看>>
Cisco设备配置AAA认证!
查看>>
UDP怎么会返回Connection refused错误
查看>>
上海i虹桥机场点烟器与UNIX哲学
查看>>
3.1-find命令详解
查看>>
清算/报表/日终跑批程序之性能优化案例(一)
查看>>
线上svn快速服务器搭建
查看>>
导航栏带子导航菜单并且高亮
查看>>
openstack-12:安装cinder存储服务
查看>>
防火墙的基础知识
查看>>