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与他上下相邻的某个数交换,问最少交换多少次可以 ...
随机推荐
- Watson Explorer Analytical Components 3 - use case scenarios
The followings are the user case scenarios that WEX can be used for generating value. 1.Customer Ins ...
- memcache缓存安装配置
memcache是高性能,分布式的内存对象缓存系统,用于在动态应用中减少数据库负载,提升访问速度.目前用memcache解决互联网上的大用户读取是非常流行的一种用法. 下载安装 前提要先安装libev ...
- TCP服务通讯
一.TCP 1.TCP又叫做套接字,传输安全,速度慢. TCP和UTP是网络的传输协议,跟java没什么关系,没有说用java做的客户端必须连接java做的服务器,我们可以用c和c++做客户端,直接连 ...
- USB的包结构及包分类
USB的传输总是低位在前,高位在后. USB的传输方向:从设备到主机的数据为输入:从主机到设备的数据叫做输出. 1. 包结构 以同步域开始,紧跟着一个包标识符PID(Packet Identifier ...
- CentOS7.3虚拟机双网卡配置
笔者在学习和工作中经常要用到linux,专门装一个linux主机固然可以,但是毕竟还要用到windows,解决的办法就是用vmware来搭建linux虚拟机.关于linux虚拟机上网的问题,笔者写过很 ...
- Java网络连接之HttpURLConnection、HttpsURLConnection
工具类包含两个方法: http请求.https请求 直接看代码: package com.jtools; import java.io.BufferedReader; import java.io.I ...
- Java使用拦截器的两种方式
拦截器是个好东西,之前用到过,现在记录一下,供以后参考使用! 其一,使用org.aspectj.lang.annotation.Aspect 先上代码: package com.test.interc ...
- 配置HTTPS服务
环境为CentOS 7.3.httpd2.4.6 一 搭建证书 说明: CA 主机为192.168.29.3 client主机为 192.168.29.100 1 生成私钥 [root@centos7 ...
- (转)centos7安装telnet服务
场景:在进行Telnet测试时候,发现无法连接,所以还得把这个软件也安装了 1 CentOS7.0 telnet-server 启动的问题 解决方法: 先检查CentOS7.0是否已经安装以下两个 ...
- (转)PL SQL Developer 使用总结
如果OS为windows 7 64位系统,Oracle版本为 Oracle 11g 64 安装PL SQL Developer 请参考 http://myskynet.blog.51cto.co ...