HDU6161

news/2024/11/25 13:51:51/

hdu6161 Big binary tree

多校1001
题目链接
题目是给一棵完全二叉树,从上到下从左到右给每个节点标号,每个点有权值,初始权值为其标号,然后有两种操作:
1、把u点权值改为x
2、查询所有经过u点的路径中,路径上的点权和最大。
节点有n个,修改有m个,n<=1e8 ,m<= 1e5
我们容易想到维护一个dp[u]代表从u点往下走能获得最大的权值

dp[u] = max(dp[u<<<1] , dp[u<<1|1]) + a[u] ;(a[u]为其本身的权值)

当我们修改某个点的权值时,只要更新其父节点到根节点的权值即可,
然后查询某个点时,由于所有节点都是正数,那么路径选的越长越好,所以在纸上画一下可以知道,这条路径可能是以该点为根的子树,从左子树的叶子走到右子树的叶子,也就是dp[u] = dp[u<<1|1] + dp[u<<1] + a[u] ;也有可能从这个点再往上走,然后走到某个点时往当前同父的另一个子节点走(用纸上画一下可以知道)
但是!!!最坑的是这个节点数非常大,会爆空间,但是我们发现如果一个点,其子树上的点都没被修改过,那么它的a[u],dp[u]都是可以通过初始值算出来的,也就是不需要开这部分空间,我们只关心询问中涉及到的点 。询问中会涉及到的点数最多<=1e5*(log n)*2,那么我们可以把这部分点放到map里,然后其他不涉及到的点都是可以直接算出来的 。

#include<algorithm>
#include<cstring>
#include<string>
#include<set>
#include<map>
#include<time.h>
#include<cstdio>
#include<vector>
#include<list>
#include<stack>
#include<queue>
#include<iostream>
#include<stdlib.h>
using namespace std;
#define  LONG long long
const LONG  INF=0x3f3f3f3f;
const LONG  MOD=1e9+7;
const double PI=acos(-1.0);
#define clrI(x) memset(x,-1,sizeof(x))
#define clr0(x) memset(x,0,sizeof x)
#define clr1(x) memset(x,INF,sizeof x)
#define clr2(x) memset(x,-INF,sizeof x)
#define EPS 1e-10
#define lson  l , mid , rt<< 1
#define rson  mid + 1 ,r , (rt<<1)|1
#define root 1, n , 1
LONG n , m ;
map<LONG ,LONG > dp ;
map<LONG ,LONG > a;
LONG Get_dp(LONG u)
{LONG tmp = u ;LONG res = 0 ;while(tmp <= n){res += tmp ;tmp = tmp*2 + 1;}LONG ret = 0 ;tmp = n ;int judge = 0 ;while(tmp){ret += tmp ;if(tmp == u){judge = 1;break ;}tmp /= 2;}if(judge )return max (ret ,res) ;else return res ;
}
int main()
{while(cin >> n >>m ){dp.clear () ;a.clear() ;char op[10] ;while(m -- ){scanf("%s",op) ;LONG  u ;if(op[0] =='q'){scanf("%lld",&u) ;LONG f1 ,f2 ,f3 ;if(dp[u<<1] == 0)f1 = Get_dp(u<<1 ) ;elsef1 = dp[u<<1] ;if(dp[u<<1|1] == 0)f2 = Get_dp(u<<1|1) ;else f2 = dp[u<<1|1] ;if(a[u] == 0)f3 = u ;else f3 = a[u] ;LONG ans = f1 + f2 + f3 ;LONG tmp = u ;LONG res ;if(dp[u] == 0) res = Get_dp(u) ;else res = dp[u] ;while(tmp>1ll){if(dp[tmp-1] == 0) f1 = Get_dp(tmp-1) ;else f1 = dp[tmp-1] ;if(dp[tmp+1] == 0) f2 = Get_dp(tmp+1) ;else f2 = dp[tmp+1] ;if(a[tmp/2] == 0) f3 = tmp/2 ;else f3 = a[tmp/2] ;if(tmp & 1ll)ans = max( ans , res + f1 + f3 ) ;elseans = max(ans , res + f2 + f3 ) ;res += f3 ;tmp /= 2 ;}printf("%lld\n",ans ) ;}else{LONG xx ;LONG tmp ;LONG ret = 0 ;scanf("%lld%lld",&u,&xx) ;ret = 0 ;if(dp[u] == 0)dp[u] = Get_dp(u) ;if(a[u] !=0) tmp = a[u] ;else tmp = u;dp[u] += ( xx - tmp ) ;a[u] = xx ;tmp = u/2;LONG f1,f2,f3 ;LONG temp ;while(tmp){if(a[tmp] !=0) f1 = a[tmp] ;else f1 = tmp ;if(dp[tmp<<1] != 0)f2 = dp[tmp<<1] ;elsef2 = Get_dp(tmp<<1) ;if(dp[tmp<<1|1] != 0) f3 = dp[tmp<<1|1] ;elsef3 = Get_dp(tmp<<1|1) ;dp[tmp] = f1 + max( f2 , f3 ) ;tmp/= 2;}}}a.clear() ;dp.clear() ;}
}

http://www.ppmy.cn/news/507315.html

相关文章

[已解决] MySQL: Error Code: 3065和Error Code: 1055

文章目录 环境问题分析解决方法一方法二扩展sql_mode属性含义sql_mode 三种作用域 环境 windows系统 问题 程序运行时遇到下面的问题&#xff1a; Error Code: 3065 Expression #1 of ORDER BY clause is not in SELECT list, references column xxxx which is not in SELE…

hdu 6165

题解&#xff1a;先找出所有的强连通分量&#xff0c;再判断各分量能否满足要求(方法&#xff1a;不断地除去入度为0的分量&#xff0c;若出现两个入度为0的分量则不合法) #include<iostream> #include<stdio.h> #include<vector> #include<stack> #in…

code 6101 和 code 6111的解决办法

<<<< code 6101 和 code 6111的解决办法 <<<< <<<< kdbchk: row locked by non-existent transaction <<<< table0 slot0 <<<< lockid2 ktbbhitc2 <<<< Block 96081 failed with…

IEC61850 总结

1. 抽象层次 自己理解&#xff0c;这个是61850的精华所在。在文档中多次提到“面向对象”的概念&#xff0c;在61850的配置文件xml文件中也可以看到对象的概念&#xff0c;可以清楚的看出所抽象出来的对象的之间的关系。 一个SCL文件&#xff0c;最顶层有三个节点&#xff0c;C…

LibreOJ - 6165 欧拉筛法+最小质因子

题目&#xff1a;一天&#xff0c;szb 在上学的路上遇到了灰太狼。 灰太狼&#xff1a;帮我们做出这道题就放了你。 szb&#xff1a;什么题&#xff1f; 灰太狼&#xff1a;求一个能被 [1,n] 内所有数整除的最小数字&#xff0c;并对 100000007 取模。 szb&#xff1a;这题太水…

hdu6165

题目链接&#xff1a;http://acm.hdu.edu.cn/showproblem.php?pid6165 题意&#xff1a;一张有向图&#xff0c;n个点&#xff0c;m条边&#xff0c;保证没有重边和自环。询问任意两个点能否满足任何一方能够到达另外一方。 思路&#xff1a;枚举每个点&#xff0c;预处理搜…

ActiveMQ配置wss

最近把前端页面由原来的http升级为了https&#xff0c;发现之前ActiveMQ提供的ws不能强求了&#xff0c;https服务下要求升级到wss。全网搜索了下&#xff0c;没有找到一个靠谱的文档 一、 证书准备 使用wss连接服务必须使用域名端口&#xff0c;而不能使用ip端口&#xff0c;这…

Libreoj #6165. 一道水题 (快速线性筛素数)

题意&#xff1a;求出能整除[1,n]中所有数的最小整数&#xff0c;对100000007取模。&#xff08;注意是1e87&#xff01;&#xff01;&#xff01;&#xff09; 思路&#xff1a;首先用线性筛筛出[1,n]的所有素数&#xff0c;记为p[i]。答案是对每个p[i]&#xff0c;求出最大的…