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与他上下相邻的某个数交换,问最少交换多少次可以 ...
随机推荐
- 使用pycurl探测web服务质量
1:pycurl模块的安装方法 easy_install pycurl pip install pycurl 2:示例代码如下,是在python3下实现的,如若使用python2稍作修改即可 # -* ...
- Apache的作用及意义
Apache服务器只是作为一个转接url的服务器,根据客户端发送的url,转接到对应的运行服务器(比如:tomcat自带的服务器)中进行相应的运行操作. 使用Apache的好处,可以隐藏掉运行服务的u ...
- HTML5 drag和drop的亲手实践
起因 最近在公司打杂的时候,突然分到了一个锅,就是要支持一个新的功能:用户可以通过拖曳组件来改变组件的顺序.因此,这阵子就看了一下网上的一些drag和drog的文章以及W3C的介绍,然后自己亲手实践了 ...
- Mac终端查看sqlite3数据库、表数据等
背景: 我们在用FMDB处理iOS数据库时,沙盒里保存的数据库格式为.sqlite3. 当我们需要在模拟器上调试或查看数据库内容时,我们可以直接在终端里查看到. 正文: 1.在沙盒路径找到需要查看到文 ...
- Ubuntu source insight3稳定性
Ubuntu 14.04 中安装了source insight3,用wine打开.导入工程,开始查看代码. 原来是直接导入了Android所有的源码,SI同步文件很慢.而且容易出现窗口变灰色的情况.经 ...
- Windows查看端口使用状况
使用端口是我们在进行远程或者打印机等都会遇到的,但是有很多用户会遇到端口被占用的情况,遇到这样的问题首先就要找出电脑中的所以端口然后进行查看,还是有很多人不知道该如何查看电脑端口. 1 查看windo ...
- (转)添加eclipse、MyEclipse、Spring Tool Suite的反编译插件
很多兄弟为在IDE里看不到源代码类而不得不下一个反编译工具,但是这样会降低代码效率,如果能直接在IDE里看,何乐而不为呢!现在我整理了一下网上很多兄弟的设置反编译的经验. 可分为下面几步. 1 下载J ...
- Objective-c 多线程操作 自定义NSOperation 模拟下载
写在前面 使用多线程下载图片,使用内存缓存和磁盘缓存. 这里只为理解NSOperation及其派生类 真要应用到APP中 请下载成熟的第三方库 效果 下载多张图片时可控制线程并发数 分析 自定义NSO ...
- Echarts关系图-力引导布局
需要做一个树形图,可以查看各个人员的关系. 可伸缩的力引导图-失败 刚开始,打算做一个可展开和伸缩的,搜索时候发现CSDN有一篇美美哒程序媛写的Echarts Force力导向图实现节点可折叠. 这里 ...
- [js] 实现接口
摘要 js 语言并没有interface implement 关键字,如果要做到和后端语言类似的接口,一般会需要模拟实现. 在oo 编程中, 接口可以让架构师规定好模块必须要实现的方法, 尽量解耦模块 ...