分析
开始学 了,先来做一个模板题。个人感觉
其实就是一个高维的二叉搜索树。其实可以像替罪羊树一样重构来保证平衡,为了偷懒就没写了。
代码
#include<bits/stdc++.h>
using namespace std;
// #define int long long
const int N = 1e7 + 100;
int read() {
int x = 0;char ch = getchar();
while(!isdigit(ch)) {ch = getchar();}
while(isdigit(ch)) {x = x * 10 + ch - '0';ch = getchar();}
return x ;
}
struct Node{int p[2],ch[2],mx[2],mi[2],si,sum,val;}t[N];
int size,rt;
void pushup(int x) {
int lc = t[x].ch[0],rc = t[x].ch[1];
for(int i = 0;i <= 1;i++) {
t[x].mi[i] = t[x].mx[i] = t[x].p[i];
if(lc) {
t[x].mx[i] = max(t[x].mx[i],t[lc].mx[i]);
t[x].mi[i] = min(t[x].mi[i],t[lc].mi[i]);
}
if(rc) {
t[x].mx[i] = max(t[x].mx[i],t[rc].mx[i]);
t[x].mi[i] = min(t[x].mi[i],t[rc].mi[i]);
}
}
t[x].sum = t[lc].sum + t[rc].sum + t[x].val;
t[x].si = t[lc].si + t[rc].si + 1;
// cout <<"node:: "<< x << " val:: "<< t[x].sum<<" debug: "<< t[x].mi[0] <<" "<< t[x].mx[0] <<" "<< t[x].mi[1] <<" "<< t[x].mx[1] << endl;
}
void insert(int &u,int x,int y,int val,int type) {
if(!u) {
u = ++size;t[u].ch[0] = t[u].ch[1] = 0;
t[u].si = 1;t[u].sum = t[u].val = val;
t[u].mx[0] = t[u].mi[0] = t[u].p[0] = x;
t[u].mx[1] = t[u].mi[1] = t[u].p[1] = y;
return ;
}
if(type == 0) {
if(x <= t[u].p[0]) insert(t[u].ch[0],x,y,val,1 - type);
else insert(t[u].ch[1],x,y,val,1 - type);
}
else {
if(y <= t[u].p[1]) insert(t[u].ch[0],x,y,val,1 - type);
else insert(t[u].ch[1],x,y,val,1 - type);
}
pushup(u);
}
bool in(int u,int lx,int rx,int ly,int ry) {
return(lx <= t[u].mi[0] && t[u].mx[0] <= rx && ly <= t[u].mi[1] && t[u].mx[1] <= ry);
}
bool out(int u,int lx,int rx,int ly,int ry) {
return (t[u].mi[0] > rx || t[u].mx[0] < lx || t[u].mi[1] > ry || t[u].mx[1] < ly);
}
int query(int u,int lx,int rx,int ly,int ry) {
if(!u) return 0;
if(in(u,lx,rx,ly,ry)) return t[u].sum;
if(out(u,lx,rx,ly,ry)) return 0;
int res = 0,lc = t[u].ch[0],rc = t[u].ch[1];
if(lx <= t[u].p[0] && t[u].p[0] <= rx && ly <= t[u].p[1] && t[u].p[1] <= ry)
res += t[u].val;
return (res + query(lc,lx,rx,ly,ry) + query(rc,lx,rx,ly,ry));
}
void print(int x) {
cout <<"node:: "<< x << " val:: "<< t[x].sum<<" debug: "<< t[x].mi[0] <<" "<< t[x].mx[0] <<" "<< t[x].mi[1] <<" "<< t[x].mx[1] << endl;
if(t[x].ch[0]) print(t[x].ch[0]);
if(t[x].ch[1]) print(t[x].ch[1]);
}
int main() {
while(1) {
int opt = read();
if(opt == 0) continue;
if(opt == 1) {
int x = read(),y = read(),a = read();
insert(rt,x,y,a,0);
}
if(opt == 2) {
int lx = read(),ly = read(),rx = read(),ry = read();
printf("%d\n",query(rt,lx,rx,ly,ry));
}
if(opt == 3) break;
// print(rt);
}
}
京公网安备 11010502036488号