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)
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 13
query 1
query 2
query 3
query 4
query 5
query 6
change 6 1
query 1
query 2
query 3
query 4
query 5
query 6

 

Sample Output
17
17
17
16
17
17
12
12
12
11
12
12

 

Source
分析:考虑dp,f(x)表示从点x开始向下走得到的最大的点权和,查询直接从x开始向上走更新答案即可。
考虑快速算 f(x) 对于子树内没有被修改过的点的 f(x) 可以快速分类讨论算出,而不满足本条件的点只有 O(mlogm) 个,在hash上dp即可。
下面给出AC代码:
复制代码
 1 #include<bits/stdc++.h>
 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<int, ll> mp;
14 map<int, int> 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_JUDGE
66     system("pause");
67 #endif
68     return 0;
69 }
复制代码

 

posted @   Angel_Kitty  阅读(239)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· [AI/GPT/综述] AI Agent的设计模式综述
点击右上角即可分享
微信分享提示
哥伦布
14°
14:09发布
哥伦布
14:09发布
14°
大雨
南风
3级
空气质量
相对湿度
93%
今天
中雨
14°/19°
周日
中雨
5°/19°
周一
1°/11°