問題描述
蒜廠有乙個 h×w 的矩形公告板,其中 h 是高度,w 是寬度。
現在有若干張 1×wi 的公告, wi 是寬度,公告只能橫著放,即高度為 1 的邊垂直於水平面,且不能互相有重疊,每張公告都要求盡可能的放在最上面的合法的位置上。
若可以放置,輸出每塊可放置的位置的行號;若不存在,輸出 −1。行號由上至下分別為 1,2,…,h。
輸入格式
第一行三個整數 h,w,n (1≤h,w≤10^9;1≤n≤200,000) 。
接下來 n 行,每行乙個整數 wi(1≤wi≤109) 。
輸出格式
輸出n 行,一行乙個整數。
樣例輸入
3 5 524
333123456
樣例輸出12
13-1這兩種方法在求解這道題上的效果並沒有很大的區別,都是從s[1]向下找。如果用c++中的cin、cout輸入輸出,最後乙個樣例都會超時(提醒我們:能用scanf和printf就盡量用這兩個)
方法一:直接暴力求解
#includeusing namespace std;
const int n=200010;
int s[4*n];
int h,w,n,wd;
void check()
} printf("-1\n");
}int main()
for(int i=1;i<=n;i++)
return 0;
}
方法二:線段樹
#includeusing namespace std;
const int n=200010;
int s[4*n];
int h,w,n;
int flag=0;
void buildtree(int p,int l,int r)
int mid=(l+r)/2;
buildtree(p*2,l,mid);//建立左子樹
buildtree(p*2+1,mid+1,r);//建立右子樹
s[p] = max(s[p*2],s[p*2+1]) ;//更新父親資訊
return;
}void modify(int p,int l,int r,int ww)
if(s[(p<<1)+1]>=ww&&!flag)
s[p]=max(s[(p<<1)],s[(p<<1)+1]);
return;
}int main()
} return 0;
}
計蒜客習題 公告板
問題 蒜廠有乙個 h w 的矩形公告板,其中 h 是高度,w 是寬度。現在有若干張 1 wi 的公告,wi 是寬度,公告只能橫著放,即高度為 1 的邊垂直於水平面,且不能互相有重疊,每張公告都要求盡可能的放在最上面的合法的位置上。若可以放置,輸出每塊可放置的位置的行號 若不存在,輸出 1。行號由上至...
計蒜客 彈簧板
有乙個小球掉落在一串連續的彈簧板上,小球落到某乙個彈簧板後,會被彈到某乙個地點,直到小球被彈到彈簧板以外的地方。假設有 n n 個連續的彈簧板,每個彈簧板佔乙個單位距離,a i a i 代表代表第 i i 個彈簧板會把小球向前彈 a i a i 個距離。比如位置 1 1 的彈簧能讓小球前進 2 2 ...
彈簧板(加強) 計蒜客
目錄 題目 題解 有乙個小球掉落在一串連續的彈簧板上,小球落到某乙個彈簧板後,會被彈到某乙個地點,直到小球被彈到彈簧板以外的地方。假設有n 個連續的彈簧板,每個彈簧板佔乙個單位距離,a i 代表代表第 i 個彈簧板會把小球向前彈a i 個距離。比如位置 1的彈簧能讓小球前進 2個距離到達位置 3。如...