29分求助(悬关)
查看原帖
29分求助(悬关)
912388
chatoudp楼主2024/3/16 15:09

测试点情况有:TLE+RE+WA+AC

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n,m,c[100005],f[100005],g[100005],v[100005][2],p[100005];
int main(){
	scanf("%lld%lld",&n,&m);
	for(int i=1;i<=n;i++)
		scanf("%lld",&c[i]);
	memset(f,0x3f,sizeof(f));
	for(int i=1;i<=n;i++){
		if(c[i]) f[i]=0,g[i]=i;
		if(f[i>>1]>f[i]+1) f[i>>1]=f[i]+1,g[i>>1]=g[i];
	}
	ll ans=0;
	for(int i=1;i<=m;i++){
		scanf("%lld",&p[i]);
		ll minn=2147483647,sum=0,pos,lca;
		for(int j=p[i];j;j>>=1){
			if(f[j]+sum<minn) minn=f[j]+sum,pos=g[j],lca=j;
			sum+=(v[j][0]>0)?-1:1;
		}
		ans+=minn;
		printf("%lld ",ans);
		c[pos]--;
		for(int j=p[i];j!=lca;j>>=1) v[j][0]?v[j][0]--:v[j][1]++;
		for(int j=pos;j!=lca;j>>=1) v[j][1]?v[j][1]--:v[j][0]++;
		for(int j=p[i];j!=lca;j>>=1){
			f[j]=1<<30;
			if(c[j]&&0<f[j]) f[j]=0,g[j]=j;
			if((j<<1)<=n&&f[j<<1]+(v[j<<1][1]?-1:1)<f[j]){
				f[j]=f[j<<1]+(v[j<<1][1]?-1:1);
				g[j]=g[j<<1];
			}
			if((j<<1|1)<=n&&f[j<<1|1]+(v[j<<1|1][1]?-1:1)<f[j]){
				f[j]=f[j<<1|1]+(v[j<<1|1][1]?-1:1);
				g[j]=g[j<<1|1];
			}
		}
		for(int j=pos;j;j>>=1){
			f[j]=1<<30;
			if(c[j]&&0<f[j]) f[j]=0,g[j]=j;
			if((j<<1)<=n&&f[j<<1]+(v[j<<1][1]?-1:1)<f[j]){
				f[j]=f[j<<1]+(v[j<<1][1]?-1:1);
				g[j]=g[j<<1];
			}
			if((j<<1|1)<=n&&f[j<<1|1]+(v[j<<1|1][1]?-1:1)<f[j]){
				f[j]=f[j<<1|1]+(v[j<<1|1][1]?-1:1);
				g[j]=g[j<<1|1];
			}
		}
	}
	return 0;
}

2024/3/16 15:09
加载中...