题目: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 ;
}

bzoj 4066 简单题——KDtree(带重构)的更多相关文章

  1. bzoj 4066: 简单题 kd-tree

    4066: 简单题 Time Limit: 50 Sec  Memory Limit: 20 MBSubmit: 234  Solved: 82[Submit][Status][Discuss] De ...

  2. BZOJ 4066 简单题 ——KD-Tree套替罪羊树

    [题目分析] 直接x,y二维轮番划分,暴力即可. 套上替罪羊,打碎重构,对于时间复杂度有了保证. 写起来好麻烦,重构的技巧很棒! [代码] #include <cstdio> #inclu ...

  3. BZOJ 4066 简单题(KD树)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4066 [题目大意] 要求维护矩阵内格子加点和矩阵查询 [题解] 往KD树上加权值点,支 ...

  4. bzoj 4066: 简单题

    #include<cstdio> #include<iostream> #include<cstdlib> #include<algorithm> #d ...

  5. bzoj 4066: 简单题 K-D树

    题目大意: http://www.lydsy.com/JudgeOnline/problem.php?id=4066 题解 我们把每次的修改操作都当作二维平面上多了一个权值点 对于每组询问可以看做求一 ...

  6. 洛谷 P4148 简单题 KD-Tree 模板题

    Code: //洛谷 P4148 简单题 KD-Tree 模板题 #include <cstdio> #include <algorithm> #include <cst ...

  7. 【BZOJ4066】简单题 KDtree

    [BZOJ4066]简单题 Description 你有一个N*N的棋盘,每个格子内有一个整数,初始时的时候全部为0,现在需要维护两种操作: 命令 参数限制 内容 1 x y A 1<=x,y& ...

  8. bzoj4066: 简单题 K-Dtree

    bzoj4066: 简单题 链接 bzoj 思路 强制在线.k-dtree. 卡常啊.空间开1e6就T了. 代码 #include <bits/stdc++.h> #define my_m ...

  9. BZOJ 2683: 简单题

    2683: 简单题 Time Limit: 50 Sec  Memory Limit: 128 MBSubmit: 913  Solved: 379[Submit][Status][Discuss] ...

随机推荐

  1. A visual proof that neural nets can compute any function

    http://neuralnetworksanddeeplearning.com/chap4.html In essence, we're using our single-layer neural ...

  2. html5plus (H5 WebApp)

    是什么? 它是增强版的手机浏览器引擎, 让HTML5达到原生水平, 它提供WebApp的规范. 它结合MUI(前端框架) + HBuilder(开发工具) 即可迅速实现开发一个app. 快速起步? 1 ...

  3. PHP的依赖管理工具----composer

    安装Composer 参考:https://getcomposer.org/doc/01-basic-usage.md composer 是PHP依赖管理工具 PHP最低版本要求5.3.2,需要允许o ...

  4. Bootstrap学习2--组件-列表组

    备注:最新Bootstrap手册:http://www.jqhtml.com/bootstraps-syntaxhigh/index.html 1.列表组 列表组是Bootstrap框架新增的一个组件 ...

  5. Python基础(5)_字符编码、文件处理

    一.文件读取过程: 1. 文本编辑器存取文件的原理(nodepad++,pycharm,word) 打开编辑器就打开了启动了一个进程,是在内存中的,所以在编辑器编写的内容也都是存放与内存中的,断电后数 ...

  6. [原创]java WEB学习笔记21:MVC案例完整实践(part 2)---DAO层设计

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

  7. 详谈 MySQL Online DDL

    作为一名DBA,对数据库进行DDL操作非常多,如添加索引,添加字段等等.对于MySQL数据库,DDL支持的并不是很好,一不留心就导致了全表被锁,经常搞得刚入门小伙伴很郁闷又无辜,不是说MySQL支持O ...

  8. jQuery自定义美化下拉框

    在线演示 本地下载

  9. 20145229吴姗珊 《Java程序设计》第9周总结

    20145229吴姗珊 <Java程序设计>第9周总结 教材学习内容总结 第十六章 整合数据库 JDBC入门 数据库本身是个独立运行的应用程序 撰写应用程序是利用通信协议对数据库进行指令交 ...

  10. dhtmlxgrid v3.0学习笔记

    dhtmlxgrid v3.0学习笔记 分类: dhtmlx JavaScript2012-01-31 15:41 1744人阅读 评论(0) 收藏 举报 stylesheetdatecalendar ...