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
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 #include2 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 }