貌似是一道線段樹的題,然而線段樹太燒腦想不出來,只能暴力的玩分塊。
分塊很好想的,維護 √n 個塊,每塊都按照斜率單調遞增的標準來維護。
查詢把所有塊for一遍。
因為每個塊的斜率都是單調遞增的,對於每個塊使用二分可以節省一點點時間,就可以偷稅(愉悅)的accepted了~
玩個斜率就不該用float= =
就為了在bzoj的status上讓me的結果好看一點,用起了float省空間,然後開始了漫漫的wa之旅= =
這裡是**~~~(附贈除錯資訊)
bzoj 4112ms 2416kb
其實可以先預處理出每個樓房在哪個塊,每個塊的開始點和結束點的位置,再小小的加乙個讀優,可能還會快一點。
#include
#include
#include
#include
using namespace std;
int n,m,topp[320],bsiz,btot;
double maxslo[320],nslo[100001],nblo[320][320];
void modify(int
pos)
}maxslo[bp]=maxs;
}void query()
seen+=topp[i]-l+1;last=max(maxslo[i],last);
//printf("i=%d seen[%d]=%d l=%d\n",i,i,seen,l);
}printf("%d\n",seen);
}int main()
}
bzoj 2957 樓房重建 分塊
time limit 10 sec memory limit 256 mb submit 2420 solved 1153 submit status discuss 小a的樓房外有一大片施工工地,工地上有n棟待建的樓房。每天,這片工地上的房子拆了又建 建了又拆。他經常無聊地看著窗外發呆,數自己能夠...
分塊 bzoj2957 樓房重建
orz 分塊大爺。思路很神奇也很清晰。把 塊內最值 和 塊內有序 兩種良好的性質結合起來,非常棒地解決了這個問題。圖中黑色的樓房即為每個塊內的 可視序列 顯而易見,在塊內它們的k 斜率 是單增的。由於上圖中第乙個塊的maxk比後面兩個塊的maxk都要大,所以後兩個塊對答案沒有貢獻,這也是顯然的。這就...
bzoj2957 樓房重建,分塊
分塊沒學過的可以看,分塊入門。題解 把房子分成 n塊每塊裡面維護乙個遞增的子串行,每次更新之後,在每乙個小塊內二分查詢第乙個大於前面最大的斜率,開始斜率為0,每次找完一塊更新一次,暴力加進答案。include include include include include include inclu...