联合省选Day2 T1第一个点,数据下下来测能过,交上去wa了?? code:
#include<bits/stdc++.h>
using namespace std;
long long T,n,K,w[100005],q[400005],tr[400005],tn,ls[400005],mid,dp[400005],ll,rl,num[400005],tt[400005];
long long ans[400005],top;
void cacl(int u,int ys)
{
if(u>=tn)
{
if(q[u]<ys) dp[u]=114514191981111;
else dp[u]=0;
return ;
}
cacl(u*2,ys);
cacl(u*2+1,ys);
dp[u]=dp[2*u]+min(w[u],dp[2*u+1]);
// cout<<u<<" "<<dp[u]<<endl;
return ;
}
//void add(int u,int ys)
//{
// num[u]=dp[u];
// if(u>=tn)
// {
// return ;
// }
// add(u*2,ys);
// add(u*2+1,ys);
//}
long long dfs(int u,long long k,int l,int r)
{
// cout<<u<<endl;
if(u>=tn)
{
top++;
ans[top]=q[u];
return 0;
}
else
{
long long sum=0,dl,dr;
// l=r=u;
// while(l*2<tn) l*=2;
// while((r*2+1)<tn) r=r*2+1;
l=1,r=tn;
while(l<r)
{
mid=(l+r)/2+1;
// cout<<mid<<endl;
cacl(u,mid);
if(dp[u]>k) r=mid-1;
else
{
l=mid;
dl=dp[u*2];
dr=dp[u*2+1];
}
}
// cout<<"/////"<<endl;
ll=rl=u*2;
while(ll<tn) ll*=2;
while(rl<tn) rl=rl*2+1;
// cout<<l<<" "<<ll<<" "<<rl<<endl;
if(tt[l]>=ll&&tt[l]<=rl)
{
sum=dfs(u*2,k-min(dr,w[u]),l,r);
if(k>=sum+dr) sum+=dfs(u*2+1,k-sum,l,r);
else sum+=w[u]+dfs(u*2+1,k-sum-w[u],l,r);
}
else
{
sum=dfs(u*2+1,k-dl,l,r);
sum+=dfs(u*2,k-sum,l,r);
}
return sum;
}
}
int main()
{
// freopen("cs.out","w",stdout);
cin>>T;
while(T--)
{
top=0;
scanf("%lld%lld",&n,&K);
tn=(1<<n);
for(int i=1;i<=tn-1;i++)
{
scanf("%lld",&w[i]);
}
for(int i=1;i<=tn;i++)
{
scanf("%lld",&ls[i]);
q[tn+i-1]=ls[i];
tt[ls[i]]=tn+i-1;
}
dfs(1,K,1,1);
// cout<<endl<<endl;
for(int i=1;i<=top;i++)
{
printf("%lld ",ans[i]);
}
cout<<endl;
}
return 0;
}
1.in
5
4 41704513771
63172871346 30595220734 16095671102 3822055819 13738718698 5991071599 14075850903 6874431191 1954448141 4475339255 4509212246 3504301339 4327559573 3485545593 2074035498
7 9 5 16 3 4 1 11 14 12 2 8 15 6 13 10
4 63715445249
61413836337 11125139971 8494516376 13086757419 19161322522 935591038 5864840209 2436855506 5427420804 3091857433 1466786642 3483688932 3156703825 7139814394 5211722473
7 4 9 13 11 16 2 14 3 6 1 15 8 5 12 10
4 76781487230
87856895769 9461732595 26386254959 18275722542 9582235352 5873564893 12257714597 8160750851 6619822566 8491303373 8311057216 2024345086 7166892352 6794943819 1302208455
1 16 7 4 15 9 3 13 2 12 6 14 5 11 8 10
4 62738926280
68608144394 455832444 29501371304 12702666392 9047737820 11908603862 8444230774 6361342524 9254816214 3885679475 5201006114 5053147318 6330020322 2937211904 3156700501
14 8 10 13 4 15 7 3 16 11 1 2 5 12 9 6
4 74808510934
86214825969 20115645025 3147560298 12246279264 17338288445 6169415471 13476840002 222772729 9769277517 9960092558 711746646 4509183369 6629895897 1999455525 2085418672
2 6 10 5 13 12 7 3 14 8 16 11 15 4 1 9
1.out
6 15 10 13 12 14 2 8 7 9 5 16 1 11 3 4
3 6 1 15 8 5 12 10 7 4 9 13 11 16 2 14
1 16 7 4 15 9 3 13 2 12 6 14 5 11 8 10
11 16 1 2 5 12 6 9 14 8 10 13 3 7 4 15
2 6 10 5 13 12 7 3 14 8 16 11 15 4 1 9