無腦kd樹,但是它卡我常數啊啊啊啊啊啊啊!!!!!
寫完一交tle
2min later,找到了乙個sb錯誤:比較大小比較反了。。。
然後就開始迴圈展開
又t了然後就寫了部分重構,調了個0.7的引數
又t了然後把函式裡面的陣列開成全域性變數
還是t了
自閉了。。。
於是就寫了乙個資料生成器,手造了一組最大資料
然後拿了乙個標程來對拍
發現我一組資料要執行30s+,標程一組資料2s。。。。
然後在函式裡面寫了乙個con來計數呼叫了多少次
發現自己一次詢問要花90000~140000次呼叫
叫來master.yi大佬,他一眼就看出來我的0號點的初始範圍開小了,應該開1000000+,然而我只開了100000。。。
改了之後就正常了,一次詢問500~1400次呼叫,一組資料3s+
but,交上bzoj
還是t了。。。。@……%……%@*&……%
然後就有了乙個奇怪的想法:
insert4500次之後來一次大重構,
各個子樹如果不滿足平衡常數0.75就進行一次小重構。
測了一下,一組資料2s+
交上去running & judging
感覺自己等了一千年
然後它終於accepted了
**:(49680ms)
#pragma gcc optimize(2)
#include#include#includeusing namespace std;
inline int gi()
return num****;
}#define n 200005
#define lc ch[i][0]
#define rc ch[i][1]
int d;long long con;
int ch[n][2],rt,tot;
int siz[n],tmp[n],cnt;
int a[n][2],mi[n][2],mx[n][2];
int sum[n],val[n];
int zb[2],k,qmi[2],qmx[2];
inline void pushup(int i)
inline bool cmp(const int &x,const int &y)
void dfs(int i)
void insert(int &i,int d)
bool ***=(a[i][d]<=zb[d]);
insert(ch[i][***],d^1);
pushup(i);
if(1.0*max(siz[lc],siz[rc])>0.75*siz[i])
}int ans;
void query(int i)
{ //con++;
if(!i)return;
if(mi[i][0]>qmx[0]||mx[i][0]qmx[1]||mx[i][1]
就當是鍛鍊了一下除錯能力吧。。。
BZOJ 4066 KD樹 範圍計數 暴力重構
題意 單點更新,大矩陣 n n,n 10 5 求和 二維的kd樹能使最壞情況不高於 o n sqrt 核心在於query時判斷當前子樹維護的區間是否有交集 當前子節點是否在塊中,然後暴力.然後跑30s的kd樹.維護size的重構方法不知為何t了,借鑑了hzwer的按數目重構 乙個微小的工作是如果更新...
BZOJ2683 簡單題 題解
1.若n比較小,則可以用二維的樹狀陣列或線段樹來做,但是500000,空間開不下,於是考慮離線cdq。子矩陣的數字和表示為也就是二維字首和,因此乙個要查詢的子矩陣,對其有影響的矩陣為s x2 y2 s x2 y1 1 s x1 1 y2 s x1 1 y1 1 這四個字首子矩陣 所以,在沒有修改操作...
bzoj4915 簡單的數字題
傳送門 題解 出自第52屆imo試題第1題。首先第一問一定是4 樣例給你了啊 如果要你證明,我們不妨令a123 4那麼有s a1 a2 a3 a4 s 2 a1 2 a2 2 a3 2 a4 2 那麼有a3 2 a4 2 a3 2 a4 2 a1 2 a2 2 a3 2 a4 2 s 2,即a3 a...