2017多校第9场 HDU 6161 Big binary tree 思维,类似字典树
题目链接: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 思维,类似字典树的更多相关文章
- 2017多校第7场 HDU 6121 Build a tree K叉树,思维
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6121 题意:一个n个点的完全k叉树,求每个节点的size的异或和. 解法:容易发现,考虑根的所有孩子, ...
- 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 ...
- HDU 6161.Big binary tree 二叉树
Big binary tree Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)T ...
- 2017多校第9场 HDU 6170 Two strings DP
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6170 题意:给了2个字符串,其中第2个字符串包含.和*两种特别字符,问第二个字符串能否和第一个匹配. ...
- 2017多校第9场 HDU 6169 Senior PanⅡ 数论,DP,爆搜
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6169 题意:给了区间L,R,求[L,R]区间所有满足其最小质数因子为k的数的和. 解法: 我看了这篇b ...
- 2017多校第10场 HDU 6181 Two Paths 次短路
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6181 题意:给一个图,求出次短路. 解法:我之前的模板不能解决这种图,就是最短路和次短路相等的情况,证 ...
- 2017多校第10场 HDU 6180 Schedule 贪心,multiset
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6180 题意:给了一些任务的开始时间和终止时间,现在让我们安排k台及机器,让这些任务在k太机器上最小,并 ...
- 2017多校第10场 HDU 6178 Monkeys 贪心,或者DP
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6178 题意:给出一棵有n个节点的树,现在需要你把k只猴子放在节点上,每个节点最多放一只猴子,且要求每只 ...
- 2017多校第10场 HDU 6171 Admiral 双向BFS或者A*搜索
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6171 题意: 给你一个高度为6的塔形数组,你每次只能将0与他上下相邻的某个数交换,问最少交换多少次可以 ...
随机推荐
- Angular--ui-router的使用
先引用Angular然后引用ui-router 路由清单:我们依赖的ui.router中提供了一个服务$state,此时可以用config来配置这个服务.用$stateProvider的state方法 ...
- Unity-Shader-镜面高光Phong&BlinnPhong-油腻的师姐在哪里
[旧博客转移 - 2016年4月4日 13:13 ] 油腻的师姐: 以前玩过一款很火热的端游<剑灵>,剑灵刚出来的时候,某网页游戏广告视频中有句台词:"我不断的在寻找,有你的世界 ...
- CSS 回流(reflow)
摘录: 1. 回流 回流是指浏览器为了重新渲染部分或者全部的文档而重新计算文档中元素的位置和几何构造的过程. 因为回流可能导致整个dom树的重新构造,所以会影响性能. 2. display:no ...
- Merge使用
Role r = new Role(); r.setName("TEST"); r.setDescription("123"); r.setLevel(2); ...
- 将git版本号编译进程序
问题的提出 不管是什么版本管理工具,每一条提交记录都会有一个对应的版本号,一般是一个整数,git是一个hash字符串.不管怎样,这个版本号是唯一的,有时候我们在程序运行的时候会在日志里面输出程序的版本 ...
- background背景透明内容不透明
.demo{ padding: 25px; background-color:#000000;/* IE6和部分IE7内核的浏览器(如QQ浏览器)下颜色被覆盖 */ background-color: ...
- 动态rem与1px边框问题的理解
当我们在项目开发中,拿到设计师的设计图,满怀欣喜的准备按照设计图将页面实现出来的时候,我们通常会遇到这个问题: 如何将页面的内容按照在不同手机屏幕浏览的情况下,比例都是不变的呢?这个时候我们就需要使用 ...
- JStorm与Storm源码分析(四)--均衡调度器,EvenScheduler
EvenScheduler同DefaultScheduler一样,同样实现了IScheduler接口, 由下面代码可以看出: (ns backtype.storm.scheduler.EvenSche ...
- Android学习笔记-ScrollView(滚动条)
本节引言: 本节带来的是Android基本UI控件中的第十个:ScrollView(滚动条),或者我们应该叫他 竖直滚动条,对应的另外一个水平方向上的滚动条:HorizontalScrollView, ...
- 17.leetcode 237. Delete Node in a Linked List
Write a function to delete a node (except the tail) in a singly linked list, given only access to th ...