WA on test 20 求助
查看原帖
WA on test 20 求助
400783
Nephren_Sakura楼主2023/8/10 10:10

#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,q,l[2000005],depth[2000005];
vector<int> a[2000005],sum[2000005];//a=dep[v]-dep[u]
void pre(int cur,int s){
	if(cur>n)
		return;
	a[s].push_back(depth[cur]);
	pre(cur*2,s);
	pre(cur*2+1,s);
}
int help(int x,int val){
	if(val<0||x<1||x>n)
		return 0;
	int lt=-1,rt=a[x].size();
	while(lt+1<rt){
		int mid=lt+rt>>1;
		if(a[x][mid]<val+depth[x])
			lt=mid;
		else
			rt=mid;
	}
	int s=lt+1;
//	cout<<val<<' '<<(val+depth[x])<<'\n';
	return s*(val+depth[x])-sum[x][lt];
}
int find(int x,int val){
	if(val<0||x==0)
		return 0;
	if(x!=1){
		int cur=max(0ll,val-l[x])+find(x/2,val-l[x]);
		if((x^1)<=n)
			cur+=help(x^1,val-l[x]-l[x^1]);
		return cur;
	}
	else
		return 0;
}
void dfs(int cur,int fa,int w){
	if(cur>n)
		return;
	depth[cur]=depth[fa]+w;
	dfs(cur*2,cur,l[cur*2]);
	dfs(cur*2+1,cur,l[cur*2+1]);
	return;
}
signed main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin>>n>>q;
	for(int i=2; i<=n; i++)
		cin>>l[i];
	dfs(1,0,0);
	for(int i=1; i<=n; i++)
		pre(i,i);
	for(int i=1; i<=n; i++)
		sort(a[i].begin(),a[i].end());
	for(int i=1; i<=n; i++){
		if(a[i].size())
			sum[i].push_back(a[i][0]);
		for(int j=1; j<a[i].size(); j++)
			sum[i].push_back(sum[i][sum[i].size()-1]+a[i][j]);
	}
//	for(int i=1; i<=n; i++)
//		a[i].push_back((int)(1e18)),sum[i].push_back((int)(1e18));
	while(q--){
		int x,val;
		cin>>x>>val;
		int ans=help(x,val);
//		cout<<help(x,val)<<'\n';
		cout<<ans+find(x,val)<<'\n';
	}
	return 0;
}
2023/8/10 10:10
加载中...