题目: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. centos7 PXE自动安装环境搭建

    原理: 要进行自动安装的主机A,加电启动时以网卡为第一启动设备 1.启动时会向网络广播,找到dhcp服务器B请求分配IP地址信息,服务器B除了给其分配基本的IP信息(ip.netmask.getewa ...

  2. python cookbook第三版学习笔记十九:未包装的函数添加参数

    比如有下面如下的代码,每个函数都需要判断debug的是否为True,而默认的debug为False def a(x,debug=False): if debug: print('calling a') ...

  3. Django之表单验证

    对于前端的表单进行验证的方法,从最简单的js到基于XML传输的Ajax,再到cookie的免认证,现在Django为我们提供了自带的表单验证方法. views.py: from django impo ...

  4. SE16传输配置表数据

    SE16标准工具传输配置表数据 (上面说了配置表,所以并不是所有的表都能SE16传输.) 了解到: 1.如果是可维护的表,SE16,执行 然后:表条目->传输条目.选择请求: 2.对于不可维护的 ...

  5. STM32L0 HAL库 UART 串口读写功能

    串口发送功能: uint8_t TxData[]= "01234abcde"; HAL_UART_Transmit(&huart2,TxData,,0xffff);//把T ...

  6. Android FrameLayout单帧布局

    FrameLayout:所有控件位于左上角,并且直接覆盖前面的子元素. 在最上方显示的层加上: android:clickable="true" 可以避免点击上层触发底层. 实例: ...

  7. 【leetcode刷题笔记】Combination Sum

    Given a set of candidate numbers (C) and a target number (T), find all unique combinations in C wher ...

  8. 【leetcode刷提笔记】Permutations

    Given a collection of numbers, return all possible permutations. For example,[1,2,3] have the follow ...

  9. Spark Mllib源码分析

    1. Param Spark ML使用一个自定义的Map(ParmaMap类型),其实该类内部使用了mutable.Map容器来存储数据. 如下所示其定义: Class ParamMap privat ...

  10. _CRT_SECURE_NO_WARNINGS

    在新版编程器的编译过程中我们常常会遇到一些过时或者不安全的函数 举一个简单的例子: 很多带"_s"后缀的函数是为了让原版函数更安全,传入一个和参数有关的大小值,避免引用到不存在的元 ...