題意:單點更新,大矩陣(\(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個黑色棋子。他每次要麼放到棋盤上...