题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4066

带部分重构的KDtree。就是那个替罪羊树思想的。

写了对拍,调了半天,发现忘了 rebd 里 fa==0 的时候改 rt !改后就能以一个很慢的速度A了。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<ctime>
using namespace std;
int n,m,k,op,x1,y1,x2,y2,ad;
int main()
{
srand(time());
n=rand()%(+);printf("%d\n",n); n++;
m=rand()%(+);
k=-m;
while(m--)
{
op=rand()%+; printf("%d ",op);
if(op==)
{
x1=rand()%n; y1=rand()%n; ad=rand()%k;
printf("%d %d %d\n",x1,y1,ad);
}
else
{
x1=rand()%n; y1=rand()%n; x2=rand()%n; y2=rand()%n;
printf("%d %d %d %d\n",x1,y1,x2,y2);
}
}
printf("3\n");
return ;
}

maker

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int main()
{
int cnt=;
while()
{
system("bzoj4066-maker.exe > bzoj4066-data.in");
system("bzoj4066-zj.exe < bzoj4066-data.in > bzoj4066-zj.out");
system("bzoj4066-baoli.exe < bzoj4066-data.in > bzoj4066-bl.out");
if(system("fc bzoj4066-zj.out bzoj4066-bl.out"))
return ;
cnt++; printf("(%d)\n",cnt);
}
return ;
}

duipai

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=2e5+;
int n,x[N],y[N],h[N],x1,y1,x2,y2,tot,ans;
int rdn()
{
int ret=;char ch=getchar();
while(ch>''||ch<'') ch=getchar();
while(ch>=''&&ch<='') ret=(ret<<)+(ret<<)+ch-'',ch=getchar();
return ret;
}
int main()
{
n=rdn();
while((n=rdn())!=)
{
if(n==)
{
x[++tot]=(rdn()^ans);y[tot]=(rdn()^ans);
h[tot]=(rdn()^ans);
}
else
{
x1=(rdn()^ans); y1=(rdn()^ans);
x2=(rdn()^ans); y2=(rdn()^ans);
ans=;
for(int i=;i<=tot;i++)
if(x[i]>=x1&&x[i]<=x2&&y[i]>=y1&&y[i]<=y2) ans+=h[i];
printf("%d\n",ans);
}
}
return ;
}

baoli

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define db double
#define ls c[cr][0]
#define rs c[cr][1]
using namespace std;
const int N=2e5+; const db alpha=0.75;
int n,ans,rt,tot,fx,Q[N],top,R,fa,xf,cnt;
//int debg;
struct Dt{
int x[],y[],p[],siz,h,ph;
}a[N];
bool cmp(Dt u,Dt v){return u.p[fx]<v.p[fx];}
struct KD{
int c[N][];Dt s[N],q;
int New_node(){return top?Q[top--]:++tot;}
void add(int cr,Dt k)
{
for(int i=;i<=;i++)
s[cr].x[i]=s[cr].y[i]=s[cr].p[i]=k.p[i];
s[cr].ph=s[cr].h=k.ph; s[cr].siz=;
ls=rs=;
}
void pshp(int cr)
{
for(int i=;i<=;i++)
{
if(ls) s[cr].x[i]=min(s[cr].x[i],s[ls].x[i]),
s[cr].y[i]=max(s[cr].y[i],s[ls].y[i]);
if(rs) s[cr].x[i]=min(s[cr].x[i],s[rs].x[i]),
s[cr].y[i]=max(s[cr].y[i],s[rs].y[i]);
}
s[cr].h=(ls?s[ls].h:)+(rs?s[rs].h:)+s[cr].ph;
s[cr].siz=(ls?s[ls].siz:)+(rs?s[rs].siz:)+;
}
bool check(int cr)
{ return (ls&&s[ls].siz>s[cr].siz*alpha)
||(rs&&s[rs].siz>s[cr].siz*alpha);}
void insert(int &cr,int now)
{
if(!cr){ cr=New_node(); add(cr,q); return;}
if(q.p[now]<=s[cr].p[now]) insert(ls,!now);
else insert(rs,!now);
pshp(cr); if(check(cr)) R=cr,fx=now;
if(R==ls) fa=cr,xf=; if(R==rs) fa=cr,xf=;
}
bool Ok(int cr)
{ return s[cr].p[]>=q.x[]&&s[cr].p[]<=q.y[]
&&s[cr].p[]>=q.x[]&&s[cr].p[]<=q.y[];}
int g(int cr)
{
int xmn=s[cr].x[],xmx=s[cr].y[],ymn=s[cr].x[],ymx=s[cr].y[];
if(xmn>q.y[]||xmx<q.x[]||ymn>q.y[]||ymx<q.x[]) return ;
if(xmn>=q.x[]&&xmx<=q.y[]&&ymn>=q.x[]&&ymx<=q.y[]) return ;
return ;
}
void query(int cr)
{
if(Ok(cr)) ans+=s[cr].ph;
int dl=(ls?g(ls):),dr=(rs?g(rs):);
// if(++debg<=50)printf("cr=%d(%d,%d) dl=%d dr=%d\n",
// cr,s[cr].p[0],s[cr].p[1],dl,dr);
if(dl==) ans+=s[ls].h; else if(dl) query(ls);
if(dr==) ans+=s[rs].h; else if(dr) query(rs);
}
void kill(int cr)
{
Q[++top]=cr; a[++cnt]=s[cr];
// if(debg<=50)
// printf("kill cr=%d a=(%d,%d)\n",cr,a[cnt].p[0],a[cnt].p[1]);
if(ls)kill(ls); if(rs)kill(rs);
}
void build(int &cr,int l,int r,int now)
{
int mid=l+r>>; fx=now; nth_element(a+l,a+mid,a+r+,cmp);
cr=New_node(); add(cr,a[mid]);
if(l<mid) build(ls,l,mid-,!now);
if(mid<r) build(rs,mid+,r,!now);
pshp(cr);
// if(debg<=50) printf("cr=%d x=%d~%d y=%d~%d\n",cr,
// s[cr].x[0],s[cr].y[0],s[cr].x[1],s[cr].y[1]);
}
void rebd(int cr)
{
// if(debg<=50)printf("rdbd! cr=%d fa=%d\n",cr,fa);
cnt=; kill(cr);
// if(debg<=50) printf("cnt=%d\n",cnt);
int mid=+cnt>>; nth_element(a+,a+mid,a+cnt+,cmp);
cr=New_node(); add(cr,a[mid]);
if(fa) c[fa][xf]=cr; else rt=cr; ///rt=cr!!!
int now=fx;
if(<mid) build(ls,,mid-,!now);
if(mid<cnt) build(rs,mid+,cnt,!now);
pshp(cr);
}
}kd;
int rdn()
{
int ret=;char ch=getchar();
while(ch>''||ch<'') ch=getchar();
while(ch>=''&&ch<='') ret=(ret<<)+(ret<<)+ch-'',ch=getchar();
return ret;
}
int main()
{
n=rdn();
while((n=rdn())!=)
{
if(n==)
{
kd.q.p[]=(rdn()^ans); kd.q.p[]=(rdn()^ans);
kd.q.ph=(rdn()^ans); fa=; kd.insert(rt,);
}
else
{
kd.q.x[]=(rdn()^ans); kd.q.x[]=(rdn()^ans);
kd.q.y[]=(rdn()^ans); kd.q.y[]=(rdn()^ans);
ans=; kd.query(rt); printf("%d\n",ans);
}
if(R)
{
if(R==rt)fa=; kd.rebd(R); R=;
}
}
return ;
}

最新文章

  1. j2ee log4j集中式日志解决方案logpool v0.3
  2. Oracle中没有 if exists(...)
  3. 从零开始学习jQuery (八) 插播:jQuery实施方案
  4. HBase架构深度解析
  5. windows下读取utf-8文件
  6. css动画特效与js动画特效(一)------2017-03-24
  7. 【JAVAWEB学习笔记】25_Linux基础
  8. 10-HTTPServletReauest和HTTPServletResponse
  9. C#版 - Leetcode 215. Kth Largest Element in an Array-题解
  10. 通过mysqlbinlog 恢复数据
  11. 论Object.keys(), Object.getOwnPropertyNames(), for in, Object.getOwnPropertySymbol()区别
  12. jvm回收器回收过程一:CMS和 G1的初认知(持续更新中)
  13. 一个简单的mock server
  14. JAVA SpringBoot 项目打包(JAR),在打包成 docker 镜像的基本方法
  15. bootstrap栅格系统进行偏移格式
  16. 彻底解决mac下terminal路径显示问题
  17. 使用免安装压缩包安装MySQL
  18. 关于C++学习笔记
  19. json中把非json格式的字符串转换成json对象再转换成json字符串
  20. vmware centos7 静态ip设置

热门文章

  1. 九度OJ 1255:骰子点数概率 (递归、DP)
  2. antd-mobile的例子--cnode
  3. ABAP制作密码输入框
  4. IntelliJ IDEA(2017)安装和破解(转发)
  5. Maven下载、安装和配置(转发:http://blog.csdn.net/jiuqiyuliang/article/details/45390313)
  6. ZOJ - 3761 Easy billiards 【并查集+DFS】
  7. HTTP基础概念讲解
  8. Linux删除文件后空间不释放
  9. 开发rsync启动脚本
  10. Excel 2007中自定义数字格式前要了解的准则