HZAU 1203 One Stroke(倍增)

题目链接:http://acm.hzau.edu.cn/problem.php?id=1203

【题意】给你一颗完全二叉树每个节点都有一个权值,然后要你从上往下找一条链,值得链上权值的和<K,且节点数最大。

【分析】有两种做法:一种是在树上双指针,另一种是先求一下前缀和,当到i节点时前缀和<K,更新ans,当前缀和>K,倍增向上找

使得前缀和<K的节点,更新ans。

#include <bits/stdc++.h>
#define inf 100000000
#define met(a,b) memset(a,b,sizeof a)
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
typedef long long ll;
using namespace std;
const int N = 1e6+5;
const int M = 4e5+5;
int n,m,ans;
int a[N];
int sum[N],fa[N][22],dep[N];
void dfs(int u,int f){
    if(u>n)return;
    sum[u]=sum[f]+a[u];
    dep[u]=dep[f]+1;
    fa[u][0]=f;
    for(int i=1;i<22;i++)fa[u][i]=fa[fa[u][i-1]][i-1];
    if(sum[u]<=m)ans=max(ans,dep[u]);
    else {
        int v=u;
        for(int i=21;i>=0;i--){
            if(sum[u]-sum[fa[v][i]]<=m){
                ans=max(ans,dep[u]-dep[fa[v][i]]);
                v=fa[v][i];
            }
        }
    }
    dfs(u*2,u);
    dfs(u*2+1,u);
}
int main() {
    int T,op,x,y,v;
    scanf("%d",&T);
    for(int cas=1;cas<=T;cas++){
        met(fa,0);
        ans=0;
        met(sum,0);
        met(dep,0);
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++){
            scanf("%d",&a[i]);
        }
        dfs(1,0);
        printf("%d\n",ans==0?-1:ans);
    }
    return 0;
}
时间: 2024-10-27 08:26:00

HZAU 1203 One Stroke(倍增)的相关文章

hzau 1203 One Stroke

1203: One Stroke Time Limit: 2 Sec  Memory Limit: 1280 MBSubmit: 264  Solved: 56[Submit][Status][Web Board] Description There is a complete binary tree which includes n nodes. Each node on the tree has a weight w, each edge on the tree is directed fr

【BZOJ 3551】[ONTAK2010] Peaks加强版 Kruskal重构树+树上倍增+主席树

这题真刺激...... I.关于Kruskal重构树,我只能开门了,不过补充一下那玩意还是一棵满二叉树.(看一下内容之前请先进门坐一坐) II.原来只是用树上倍增求Lca,但其实树上倍增是一种方法,Lca只是他的一种应用,他可以搞各种树上问题,树上倍增一般都会用到f数组. |||.我们跑出来dfs序就能在他的上面进行主席树了. IV.别忘了离散. V.他可能不连通,我一开始想到了,但是我觉得出题人可能会是好(S)人(B),但是...... #include <cstdio> #include

PAT Acute Stroke (30)

题目描述 One important factor to identify acute stroke (急性脑卒中) is the volume of the stroke core. Given the results of image analysis in which the core regions are identified in each MRI slice, your job is to calculate the volume of the stroke core. 输入描述:

TLS 协议所定义的严重错误代码是 10。Windows SChannel 错误状态是 1203

windows 2012 操作系统下面报36888/36887. 生成了一个严重警告并将其发送到远程终结点.这会导致连接终止.TLS 协议所定义的严重错误代码是 10.Windows SChannel 错误状态是 1203. 从远程终点接收到一个严重警告.TLS 协议所定义的严重警告代码为 48. 其实schannel的事件录入是分成4个等级的: Logging options The default value for Schannel event logging is 0×0000 in W

【NOIP2012提高组】开车旅行 倍增

题目分析 朴素的做法就是预处理下一个目的地,然后跑模拟,超时. 本题最重要的考点是倍增优化.设$fa[i][j]$表示a从i出发行驶$2^j$“次”后行驶的路程,$fb[i][j]$表示从i出发行驶$2^j$“次”后行驶的路程,注意这里的"次",a.b交替行驶.$f[i][j]$表示从i出发a.b交替$2^j$“次”后行驶到的城市编号. 显然有$fa[i][j] = fa[i][j - 1] + fa[f[i][j - 1]][j - 1], fb = fb[i][j - 1] + f

【bzoj1146】[CTSC2008]网络管理Network 倍增LCA+dfs序+树状数组+主席树

题目描述 M公司是一个非常庞大的跨国公司,在许多国家都设有它的下属分支机构或部门.为了让分布在世界各地的N个部门之间协同工作,公司搭建了一个连接整个公司的通信网络.该网络的结构由N个路由器和N-1条高速光缆组成.每个部门都有一个专属的路由器,部门局域网内的所有机器都联向这个路由器,然后再通过这个通信子网与其他部门进行通信联络.该网络结构保证网络中的任意两个路由器之间都存在一条直接或间接路径以进行通信. 高速光缆的数据传输速度非常快,以至于利用光缆传输的延迟时间可以忽略.但是由于路由器老化,在这些

4444: [Scoi2015]国旗计划|贪心|倍增

由于没有区间被其它区间包括这个条件,也就是假设li<lj那么一定满足ri<rj,就能够贪心搞一搞了. 假如区间[l,r]都已经被覆盖,那么能够继续找一个li在[l,r]范围内的最大的一个,继续扩展覆盖的区间,然后再以相同的方式找下一个战士 这样能够依照左端点排序,然后每个战士要找的下一个战士都是确定的,然后用倍增找出一共须要多少战士就能够了 #include<algorithm> #include<iostream> #include<cstdlib> #i

洛谷 P1086 开车旅行 【倍增+STL】

题目: https://www.luogu.org/problem/show?pid=1081 分析: 这题第一眼给人的感觉就是要模拟,模拟两人交替开车,分别预处理出离特定城市第一近和第二近的(用set).实际上就是这样,只不过用set和倍增优化了一下,用: g[i][k]表示从位置i开始,两人轮流开2^k轮车最后到达的位置: f[i][j][0] 表示表示从位置i开始,两人轮流开2^k轮车最后小A走过的距离: f[i][j][1] 表示表示从位置i开始,两人轮流开2^k轮车最后小B走过的距离:

TOJ 1203: Number Sequence

1203: Number Sequence Time Limit(Common/Java):1000MS/10000MS     Memory Limit:65536KByte Total Submit: 957            Accepted:208 Description A number sequence is defined as follows: f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) + B * f(n - 2)) mod 7. Gi