一開始寫好覺得太好了,我進步到這種難度題目也會寫了,結果居然超時。後來用分治就過了,我其實不大知道時間複雜度是甚麼或怎麼算,總之測試分治有成功。快速地介紹解題思路:開三個陣列,一個紀錄重量,一個紀錄左編號,一個紀錄右編號,使用分治函式呼叫1,於是重量的陣列累加完成,這個是不超時的關鍵。然後分辨左右重量,以及累加依序進入的貨物重量,依序輸出最後到達貨箱編號。原始碼如下:
#include<cstdio>
#define N 200005
int a[N]={0},l[N],r[N];
int n,m,i,p,s,t;
int w(int g)
{
if(g>=n) return a[g];
a[g]=w(l[g])+w(r[g]);
return a[g];
}
int main()
{
scanf("%d%d",&n,&m);
for(i=0;i<n;i++)
scanf("%d",&a[n+i]);
int b[m],d[n][2],f,e;
for(i=0;i<m;i++)
scanf("%d",&b[i]);
for(i=1;i<n;i++)
{
scanf("%d%d%d",&p,&s,&t);
l[p]=s;
r[p]=t;
}
int j=2*n;
a[1]=w(1);
for(i=0;i<m;i++)
{
f=1;
while(f<n)
{
if(a[l[f]]<=a[r[f]])
f=l[f];
else
f=r[f];
a[f]+=b[i];
}
if(i==0)
printf("%d",f);
else
printf(" %d",f);
}
printf("\n");
return 0;
}