bzoj 4066 简单题——KDtree(带重构)
题目: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(带重构)的更多相关文章
- bzoj 4066: 简单题 kd-tree
4066: 简单题 Time Limit: 50 Sec Memory Limit: 20 MBSubmit: 234 Solved: 82[Submit][Status][Discuss] De ...
- BZOJ 4066 简单题 ——KD-Tree套替罪羊树
[题目分析] 直接x,y二维轮番划分,暴力即可. 套上替罪羊,打碎重构,对于时间复杂度有了保证. 写起来好麻烦,重构的技巧很棒! [代码] #include <cstdio> #inclu ...
- BZOJ 4066 简单题(KD树)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4066 [题目大意] 要求维护矩阵内格子加点和矩阵查询 [题解] 往KD树上加权值点,支 ...
- bzoj 4066: 简单题
#include<cstdio> #include<iostream> #include<cstdlib> #include<algorithm> #d ...
- bzoj 4066: 简单题 K-D树
题目大意: http://www.lydsy.com/JudgeOnline/problem.php?id=4066 题解 我们把每次的修改操作都当作二维平面上多了一个权值点 对于每组询问可以看做求一 ...
- 洛谷 P4148 简单题 KD-Tree 模板题
Code: //洛谷 P4148 简单题 KD-Tree 模板题 #include <cstdio> #include <algorithm> #include <cst ...
- 【BZOJ4066】简单题 KDtree
[BZOJ4066]简单题 Description 你有一个N*N的棋盘,每个格子内有一个整数,初始时的时候全部为0,现在需要维护两种操作: 命令 参数限制 内容 1 x y A 1<=x,y& ...
- bzoj4066: 简单题 K-Dtree
bzoj4066: 简单题 链接 bzoj 思路 强制在线.k-dtree. 卡常啊.空间开1e6就T了. 代码 #include <bits/stdc++.h> #define my_m ...
- BZOJ 2683: 简单题
2683: 简单题 Time Limit: 50 Sec Memory Limit: 128 MBSubmit: 913 Solved: 379[Submit][Status][Discuss] ...
随机推荐
- 解决PL/SQL Developer过期
1 2 3 4 5 6 分步阅读 PL/SQL Developer过期了,又没有注册码,又不想花钱买,而且事情又非常急,这时候怎么办?不要着急,请随小编一起解决这种情况吧. 工具/原料 PL/SQ ...
- html5 (新一代的html)
简介 h5的新特性: cavas / video / audio / cache / element / form 最小的h5文档: <!DOCTYPE html> <html> ...
- hdu2563——统计问题
Problem Description 在一无限大的二维平面中,我们做例如以下如果: 1. 每次仅仅能移动一格. 2. 不能向后走(如果你的目的地是"向上",那么你能够向左走, ...
- Activiti使用过程_1
1 微信公众号:
- 从分布式锁来看redis和zookpeer!
从分布式锁来看redis和zookpeer! 目前网上大部分的基于zookpeer,和redis的分布式锁的文章都不够全面.要么就是特意避开集群的情况,要么就是考虑不全,读者看着还是一脸迷茫.坦白说, ...
- HDR(High Dynamic Range) - 高动态范围
1. Dynamic Range 动态范围是指一个场景的最亮和最暗部分之间的相对比值 2. Tone-mapping 现实真正存在的亮度差,即最亮的物体亮度和最暗的物体亮度之比为 , 而人类的眼睛 ...
- 【leetcode刷题笔记】Best Time to Buy and Sell Stock II
Say you have an array for which the ith element is the price of a given stock on day i. Design an al ...
- 一步一步带你分析 requirejs
详细源代码一共就2000多行,来看我这篇分析的同学应该都下载下来了,好了,话不多说,开始: 代码的开头就出现3个全局变量: requirejs, require, define var require ...
- /etc/init.d目录和/etc/rc.local脚本
一.关于/etc/init.d 如果你使用过Linux系统,那么你一定听说过init.d目录.这个目录到底是干嘛的呢?它归根结底只做了一件事情,但这件事情非同小可,是为整个系统做的,因此它非常重要.i ...
- Git 远程仓库 git remote
http://blog.csdn.net/s0228g0228/article/details/45368155 Git remote -v 查看现有远程仓库的地址url 三种方式都可以. 1. 修改 ...