kdtree 板子求调悬两关
查看原帖
kdtree 板子求调悬两关
807774
_Wind_Leaves_ShaDow_楼主2024/8/2 10:04

rt。AC #1,#2 到 #5 都显示 wrong answer On line 4 column 1, read 1, expected 0.

#include <bits/stdc++.h>
//#define int long long
#define Rg register
#define Ri Rg int
#define Il inline
#define vec vector
#define pb push_back
#define fi first
#define se second
#define IT ::iterator

using namespace std;

typedef double db;
typedef pair<int,int> pii;
const int N=2e5,Inf=1e9,mod=1e6+3;
const db eps=1e-9,alp=0.75;

int n;
int W,id=0,rt,ls[N+5],rs[N+5],sz[N+5],sl[N+5][2],sr[N+5][2],sm[N+5];
int gn,kg[N+5];
struct Kode{int ps[2],nm;}dx[N+5];

#define bad(p) (sz[ls[p]]>=alp*sz[p]||sz[rs[p]]>=alp*sz[p])

Il bool cmp(int x,int y){return dx[x].ps[W]<dx[y].ps[W];}

Il void pup(int p){
	sz[p]=sz[ls[p]]+sz[rs[p]]+1;
	sm[p]=sm[ls[p]]+sm[rs[p]]+dx[p].nm;
	for(Ri i=0;i<2;i++){
	sl[p][i]=dx[p].ps[i],sr[p][i]=dx[p].ps[i];
		if(ls[p])sl[p][i]=min(sl[p][i],sl[ls[p]][i]);
		if(rs[p])sr[p][i]=max(sr[p][i],sr[rs[p]][i]);
	}
	return;
}

Il void flat(int p){
	if(!p)return;
	flat(ls[p]);
	kg[++gn]=p;
	flat(rs[p]);
	return;
}

Il int make(int l,int r,int w){
	if(l>r)return 0;
	int mid=(l+r)>>1;W=w;
	nth_element(kg+l,kg+mid,kg+r+1,cmp);
	if(l==r)ls[kg[mid]]=rs[kg[mid]]=0;
	else ls[kg[mid]]=make(l,mid-1,w^1),rs[kg[mid]]=make(mid+1,r,w^1);
	pup(kg[mid]);
	return kg[mid];
}

Il void rbuild(int &p){
	gn=0;flat(p);
	p=make(1,gn,0);
	return;
}

Il void ins(int &p,Kode x,int w){
	if(!p)dx[p=++id]=x;
	else{
		if(x.ps[w]<dx[p].ps[w])ins(ls[p],x,w^1);
		else ins(rs[p],x,w^1);
	}
	pup(p);if(bad(p))rbuild(p);
	return;
}

Il bool inq(int qa,int qb,int qc,int qd,int na,int nb,int nc,int nd){return (qa<=na&&nc<=qc&&qb<=nb&&nd<=qd);}

Il bool ouq(int qa,int qb,int qc,int qd,int na,int nb,int nc,int nd){return (qa>na||nc>qc||qb>nb||nd>qd);}

Il int qsq(int ql0,int qr0,int ql1,int qr1,int p){
	if(!p||ouq(ql0,qr0,ql1,qr1,sl[p][0],sr[p][0],sl[p][1],sr[p][1]))return 0; 
	if(inq(ql0,qr0,ql1,qr1,sl[p][0],sr[p][0],sl[p][1],sr[p][1]))return sm[p];
	int ret=0;
	if(inq(ql0,qr0,ql1,qr1,dx[p].ps[0],dx[p].ps[1],dx[p].ps[0],dx[p].ps[1]))ret=dx[p].nm;
	ret+=qsq(ql0,qr0,ql1,qr1,ls[p])+qsq(ql0,qr0,ql1,qr1,rs[p]);
	return ret;
}
#undef bad

signed main(){
	ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
	cin>>n;int op,lans=0;
	while(cin>>op){
		if(op==3)break;
		int xa,ya,xb,yb;
		if(op==1){
			cin>>xa>>ya>>xb;
			xa^=lans,ya^=lans,xb^=lans;
			ins(rt,{{xa,ya},xb},0);
		}else{
			cin>>xa>>ya>>xb>>yb;
			xa^=lans,ya^=lans,xb^=lans,yb^=lans;
			lans=qsq(xa,ya,xb,yb,rt);cout<<lans<<'\n'; 
		}
	} 
	return 0;
}
2024/8/2 10:04
加载中...