社区讨论

K-D Tree 0pts 求条

P14312【模板】K-D Tree参与者 2已保存回复 2

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@mjqdjatg
此快照首次捕获于
2025/12/29 07:42
2 个月前
此快照最后确认于
2025/12/29 08:54
2 个月前
查看原帖
玄关 样例全过
CPP
/* ChongYun */
#include<bits/stdc++.h>
#define File(s,t) freopen(s".in","r",stdin),freopen(t".out","w",stdout)
#define Time() cerr<<fixed<<setprecision(6)<<1.*(double)(clock()-__st)/CLOCKS_PER_SEC<<"s\n"
#define Memory() cerr<<fixed<<setprecision(6)<<1.*fabs(&__t-&__s)/1024./1024.<<"MB\n"
char __s; clock_t __st;

#define break ({break;})
#define continue ({continue;})

#define int long long
#define ldb long double
#define ull unsigned long long
#define reg register

using namespace std;

#define pii pair<int,int>
#define fir first
#define sec second

#define flush() fwrite(obuf,1,O-obuf,stdout)
#define putchar(x) ((O==obuf+(1<<21))&&(flush(),O=obuf)),*O++=x
char buf[1<<23],*p1=buf,*p2=buf,obuf[1<<23],*O=obuf;
#define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
#define chLimit(x) (x>='a'&&x<='z')
inline char gc(){ reg char ch=getchar();while(!chLimit(ch)) ch=getchar();return ch; }

inline int read(){
	reg int x=0,f=1;
	reg char ch=getchar();
	while(ch<'0'||ch>'9'){ if(ch=='-') f=-1;ch=getchar(); }
	while(ch>='0'&&ch<='9') x=x*10+(ch^48),ch=getchar();
	return x*f;
}
inline void write(int x){
	if(x<0) x=-x,putchar('-');
	if(x>9) write(x/10);
	putchar((x%10)^48);
}
inline void write(int x,char ch){ write(x),putchar(ch); }
inline void write(string s){  for(reg int i=0;i<(int)s.size();++i) putchar(s[i]); }
struct Flush{ ~Flush(){ flush(); } }_;
const int N=1e6+5,B=21,inf=1e18;
int k,n,q,ans,a[N],rt[B],tot;
struct KDTree{ int ls,rs,siz,sum,val,tag,x[3],lt[3],rt[3]; }T[N],L,R;
#define ls(p) T[p].ls
#define rs(p) T[p].rs
void pushup(int p){
    T[p].siz=T[ls(p)].siz+T[rs(p)].siz+1;
    T[p].sum=T[ls(p)].sum+T[rs(p)].sum+T[p].val;
    for(int i=0;i<k;++i){
        T[p].lt[i]=min({T[p].x[i],T[ls(p)].lt[i],T[rs(p)].lt[i]});
        T[p].rt[i]=max({T[p].x[i],T[ls(p)].rt[i],T[rs(p)].rt[i]});
    }
}
void addtag(int p,int x){ T[p].tag+=x,T[p].val+=x,T[p].sum+=x*T[p].siz; }
void pushdown(int p){
    if(T[p].tag){
        if(ls(p)) addtag(ls(p),T[p].tag);
        if(rs(p)) addtag(rs(p),T[p].tag);
        T[p].tag=0;
    }
}
int build(int l,int r,int t=0){
    if(l>r) return 0;
    int mid=(l+r)>>1;
    nth_element(a+l,a+mid,a+r+1,[t](int x,int y){ return T[x].x[t]<T[y].x[t]; });
    ls(a[mid])=build(l,mid-1,(t+1)%k);
    rs(a[mid])=build(mid+1,r,(t+1)%k);
    return pushup(a[mid]),a[mid];
}
void re(int &p){
    if(!p) return ;
    a[++n]=p;
    pushdown(p);
    re(ls(p)),re(rs(p));
    p=0;
}
bool IN(int *l,int *r){ for(int i=0;i<k;++i){ if(L.x[i]>l[i]||r[i]>R.x[i]) return 0; } return 1;  }
bool OUT(int *l,int *r){ for(int i=0;i<k;++i){ if((L.x[i]<=l[i]&&l[i]<=R.x[i])||(L.x[i]<=r[i]&&r[i]<=R.x[i])) return 0; } return 1; }
int query(int p){
    if(!p||OUT(T[p].lt,T[p].rt)) return 0;
    if(IN(T[p].lt,T[p].rt)) return T[p].sum;
    pushdown(p);
    return (IN(T[p].x,T[p].x)?T[p].val:0)+query(ls(p))+query(rs(p));
}
void upd(int p,int x){
    if(!p||OUT(T[p].lt,T[p].rt)) return ;
    if(IN(T[p].lt,T[p].rt)) return addtag(p,x);
    if(IN(T[p].x,T[p].x)) T[p].val+=x;
    pushdown(p);
    upd(ls(p),x),upd(rs(p),x);
    pushup(p);
}
#undef ls(p)
#undef rs(p)
namespace Tracy{
    void Main(){
        k=read(),q=read();
        T[0].lt[0]=T[0].lt[1]=T[0].lt[2]=inf;
        while(q--){
            int op=read();
            if(op==1){
                a[n=1]=++tot;
                for(int i=0;i<k;++i) T[tot].x[i]=read()^ans;
                T[tot].val=read()^ans;
                for(int i=0;i<B;++i){
                    if(rt[i]) re(rt[i]);
                    else{
                        rt[i]=build(1,n);
                        break;
                    }
                }
            }
            if(op==2){
                for(int i=0;i<k;++i) L.x[i]=read()^ans;
                for(int i=0;i<k;++i) R.x[i]=read()^ans;
                int x=read()^ans;
                for(int i=0;i<B;++i) upd(rt[i],x);
            }
            if(op==3){
                for(int i=0;i<k;++i) L.x[i]=read()^ans;
                for(int i=0;i<k;++i) R.x[i]=read()^ans;
                int res=0;
                for(int i=0;i<B;++i) res+=query(rt[i]);
                write(ans=res,'\n');
            }
        }
    }
	char __t;
    int Reznik(int T=1){
        __st=clock();
	    while(T--) Main();
	    return /*Time(),Memory(),*/0;
    }
}

signed main(){ 
	// File("","");
	return Tracy::Reznik(); 
}

回复

2 条回复,欢迎继续交流。

正在加载回复...