BZOJ 4066 KD樹 範圍計數 暴力重構

2022-05-07 03:30:10 字數 2266 閱讀 2100

題意:單點更新,大矩陣(\(n*n,n≤10^5\))求和

二維的kd樹能使最壞情況不高於\(o(n\sqrt)\)

核心在於query時判斷當前子樹維護的區間是否有交集/當前子節點是否在塊中,然後暴力....

然後跑30s的kd樹...

維護size的重構方法不知為何t了,借鑑了hzwer的按數目重構

乙個微小的工作是如果更新時點相同那就直接合併,不要另開(雖然還是可以輕易地被卡)

t了三天三夜的題總算告一段落了

#include#define rep(i,j,k) for(register int i=j;i<=k;i++)

#define rrep(i,j,k) for(register int i=j;i>=k;i--)

#define erep(i,u) for(register int i=head[u];~i;i=nxt[i])

#define print(a) printf("%lld",(ll)(a))

#define println(a) printf("%lld\n",(ll)(a))

#define printbk(a) printf("%lld ",(ll)(a))

using namespace std;

const int maxn = 2e5+11;

const int inf = 0x7fffffff;

typedef long long ll;

ll read()

while(ch>='0'&&ch<='9')

return x*f;

}int d;

struct point

if(rc)

}sum[o]=p[o].val+sum[lc]+sum[rc];

size[o]=1+size[lc]+size[rc];

}void init()

bool ok(int o)

void insert(int &o,int now,int x,int y,int v)else if(p[o].x[0]==x&&p[o].x[1]==y)else if(now==0)

void recycle()

}kd;

int main()else}}

return 0;

}

順便貼上按size平衡因子維護的版本(tle,不打算改了)

#include#define rep(i,j,k) for(register int i=j;i<=k;i++)

#define rrep(i,j,k) for(register int i=j;i>=k;i--)

#define erep(i,u) for(register int i=head[u];~i;i=nxt[i])

#define print(a) printf("%lld",(ll)(a))

#define println(a) printf("%lld\n",(ll)(a))

#define printbk(a) printf("%lld ",(ll)(a))

using namespace std;

const int maxn = 2e5+11;

const int inf = 0x7fffffff;

typedef long long ll;

ll read()

while(ch>='0'&&ch<='9')

return x*f;

}int d;

struct point

if(rc)

}sum[o]=p[o].val+sum[lc]+sum[rc];

size[o]=1+size[lc]+size[rc];

}void init()

bool ok(int o)

void insert(int &o,int now,int x,int y,int v)else if(p[o].x[0]==x&&p[o].x[1]==y)else if(now==0)

bool inside(int x_1,int y_1,int x_2,int y_2,int x1,int y1,int x2,int y2)

bool outside(int x_1,int y_1,int x_2,int y_2,int x1,int y1,int x2,int y2)

void rebuild(int &o)

}kd;

int main()else}}

return 0;

}

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

無腦kd樹,但是它卡我常數啊啊啊啊啊啊啊!寫完一交tle 2min later,找到了乙個sb錯誤 比較大小比較反了。然後就開始迴圈展開 又t了然後就寫了部分重構,調了個0.7的引數 又t了然後把函式裡面的陣列開成全域性變數 還是t了 自閉了。於是就寫了乙個資料生成器,手造了一組最大資料 然後拿了乙...

bzoj2648 sjy擺棋子 kd樹

這天,sjy顯得無聊。在家自己玩。在乙個棋盤上,有n個黑色棋子。他每次要麼放到棋盤上乙個黑色棋子,要麼放上乙個白色棋子,如果是白色棋子,他會找出距離這個白色棋子最近的黑色棋子。此處的距離是 曼哈頓距離 即 x1 x2 y1 y2 現在給出n 500000個初始棋子。和m 500000個操作。對於每個...

bzoj2648 kd樹 SJY擺棋子

2648 sjy擺棋子 time limit 20 sec memory limit 128 mb submit 4914 solved 1688 submit status discuss description 這天,sjy顯得無聊。在家自己玩。在乙個棋盤上,有n個黑色棋子。他每次要麼放到棋盤上...