BZOJ4066 簡單題(KD樹區間求和)

2021-10-02 07:26:40 字數 1520 閱讀 8363

無腦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...