ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

P4169 [Violet]天使玩偶/SJY摆棋子(CDQ分治、暴力)

2021-12-12 22:32:07  阅读:182  来源: 互联网

标签:SJY rs int mn tr CDQ Violet mx ls


解析

之前用KDtree做的一道题
由于懒不想再码一遍了

考虑CDQ分治
关键就是如何拿掉绝对值
如果只维护左下角的,显然就是一个经典的三维偏序问题了
但是本题不一定在左下角,也可能在左上、右下、右上
怎么办?
把坐标翻转翻转直接暴力做四遍即可
有昨晚CFE题暴力枚举做36遍那味了

代码

既然没写,哪里有代码啊
那我就把之前的KDtree贴一下吧

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N=2e6+100;
const int M=1050;
const int mod=998244353;
inline ll read(){
	ll x=0,f=1;char c=getchar();
	while(!isdigit(c)){if(c=='-') f=-1;c=getchar();}
	while(isdigit(c)){x=x*10+c-'0';c=getchar();}
	return x*f;
}
int n,m,tot,num;
int rub[N],top;
int F;
struct point{int x[2];}p[N];
#define dis(a,b) (abs(a.x[0]-b.x[0])+abs(a.x[1]-b.x[1]))
bool operator < (const point a,point b){return a.x[F]<b.x[F];}
struct node{
	int mn[2],mx[2],ls,rs,siz;
	point o;
}tr[N];
int New(point u){
	int x=top?rub[top--]:++tot;tr[x].o=u;tr[x].siz=1;
	tr[x].mn[0]=tr[x].mx[0]=u.x[0];
	tr[x].mn[1]=tr[x].mx[1]=u.x[1];
	tr[x].ls=tr[x].rs=0;
	return x;
}
void pushup(int k){
	int l=tr[k].ls,r=tr[k].rs;
	for(int i=0;i<=1;i++){
		tr[k].mn[i]=tr[k].mx[i]=tr[k].o.x[i];
		if(l){
			tr[k].mn[i]=min(tr[k].mn[i],tr[l].mn[i]);
			tr[k].mx[i]=max(tr[k].mx[i],tr[l].mx[i]);
		}
		if(r){
			tr[k].mn[i]=min(tr[k].mn[i],tr[r].mn[i]);
			tr[k].mx[i]=max(tr[k].mx[i],tr[r].mx[i]);
		}
	}
	tr[k].siz=tr[l].siz+tr[r].siz+1;
	return;
}
void print(int k){
	printf("k=%d (%d %d) ls=%d rs=%d mn=(%d %d) mx=(%d %d)\n",k,tr[k].o.x[0],tr[k].o.x[1],tr[k].ls,tr[k].rs,tr[k].mn[0],tr[k].mn[1],tr[k].mx[0],tr[k].mx[1]);
}
int build(int l,int r,int f){
	int mid=(l+r)>>1;
	F=f;nth_element(p+l,p+mid,p+r+1);
	int k=New(p[mid]);
	if(l<mid) tr[k].ls=build(l,mid-1,f^1);
	if(mid<r) tr[k].rs=build(mid+1,r,f^1);
	pushup(k);
	//print(k);
	return k;
}
void pia(int k,int num){
	if(tr[k].ls) pia(tr[k].ls,num);
	p[num+tr[tr[k].ls].siz+1]=tr[k].o;
	if(tr[k].rs) pia(tr[k].rs,num+tr[tr[k].ls].siz+1);
	rub[++top]=k;
	return;
}
double A=0.95;
void check(int &k,int f){
	if(tr[tr[k].ls].siz>tr[k].siz*A||tr[tr[k].rs].siz>tr[k].siz*A){
		pia(k,0);k=build(1,tr[k].siz,f);//printf("ok");
	}
	return;
}
void insert(int &k,int f,point u){
	if(!k){
		k=New(u);return;
	}
	if(u.x[f]<=tr[k].o.x[f]) insert(tr[k].ls,f^1,u);
	else insert(tr[k].rs,f^1,u);
	pushup(k);check(k,f);
	return;
}
int getdis(point o,int k){
	int res=0;
	for(int i=0;i<=1;i++){
		res+= max(0,tr[k].mn[i]-o.x[i])+max(0,o.x[i]-tr[k].mx[i]);
	}
	return res;
}
int ans;
//void query(int k,point now){
//	int dl,dr,l=tr[k].ls,r=tr[k].rs;
//	ans=min(ans,dis(tr[k].o,now));
//	if(l) dl=getdis(now,tr[k].ls);
//	if(r) dr=getdis(now,tr[k].rs);
//	if(dl<dr){
//		if(l&&dl<ans) query(tr[k].ls,now);
//		if(r&&dr<ans) query(tr[k].rs,now);
//	}
//	else{
//		if(r&&dr<ans) query(tr[k].rs,now);
//		if(l&&dl<ans) query(tr[k].ls,now);
//	}
//}
void query(int k,point tmp) {//查询
	ans=min(ans,dis(tmp,tr[k].o));
	int dl=INT_MAX,dr=INT_MAX;
	if(tr[k].ls) dl=getdis(tmp,tr[k].ls);
	if(tr[k].rs) dr=getdis(tmp,tr[k].rs);
	if(dl<dr) {
		if(dl<ans) query(tr[k].ls,tmp);
		if(dr<ans) query(tr[k].rs,tmp);
	}
	else {
		if(dr<ans) query(tr[k].rs,tmp);
		if(dl<ans) query(tr[k].ls,tmp);
	}
}
int r;
int main(){
//	freopen("a.in","r",stdin);
//	freopen("a.out","w",stdout);
	n=read();m=read();
	for(int i=1;i<=n;i++){
		p[i]=(point){read(),read()};
	}
	r=build(1,n,0);
	for(int i=1;i<=m;i++){
		int op=read(),x=read(),y=read();
		point o=(point){x,y};
		if(op==1){
			insert(r,0,o);
		}
		else{
			ans=2e9;
			query(r,o);
			printf("%d\n",ans);
		}
	}
	return 0;
}
/*
5 1
725 771
285 344
155 16
674 79
674 710
2 427 398
*/

标签:SJY,rs,int,mn,tr,CDQ,Violet,mx,ls
来源: https://blog.csdn.net/BUG_Creater_jie/article/details/121894727

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有