NZAU 1203: One Stroke 树上二分前缀和

来源:互联网 发布:xapmm 设置域名重定向 编辑:程序博客网 时间:2024/06/16 02:14

因为这是颗完全二叉树,节点都是按次序编号的,所以递归顺序很明确,判断终止条件也很明确,枚举每个点,并更新以深度为下标的前缀和,二分找到离当前节点最远且到当前节点的权值小于等于k的点。

#include <iostream>#include <cstdio>#include <cstdlib>#include <cstring>#include <algorithm>#include <vector>#include <map>#include <cmath>#include <set>#include <queue>using namespace std;const int INF=1e9+10;typedef long long ll;int T,n,k;int a[1000006];int sum[100];int ans1;void dfs(int u,int dep){if(u>n) return;sum[dep]=sum[dep-1]+a[u];int l=0,r=dep,ans;while(l<=r){int mid=(l+r)/2;if(sum[dep]-sum[mid]<=k){r=mid-1;ans=mid;}else  l=mid+1;}ans1=max(ans1,dep-ans);dfs(u*2,dep+1);dfs(u*2+1,dep+1);}int main(){scanf("%d",&T);while(T--){ans1=0;scanf("%d %d",&n,&k);for(int i=1;i<=n;i++) scanf("%d",&a[i]);dfs(1,1);if(ans1==0) printf("-1\n");else printf("%d\n",ans1 );}return 0;}


原创粉丝点击