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] ...
随机推荐
- TensorFlow_action
安装TensorFlow 包依赖 C:\Users\sas> pip3 install --upgrade tensorflow Collecting tensorflow Downloadi ...
- HDU 4513 吉哥系列故事――完美队形II(Manacher)
题目链接:cid=70325#problem/V">[kuangbin带你飞]专题十六 KMP & 扩展KMP & Manacher V - 吉哥系列故事――完美队形I ...
- Symfony 如何使用ckeditor
首先: 1)加载以下两个bundle "egeloen/ckeditor-bundle": "^4.0","helios-ag/fm-elfinder ...
- scala actor编程之对象传递
scala 最吸引人的一点就是actor并发编程了.但是纵观scala官方文档,baidu文档,IBM文档都写的通过字符串传呀传,如果用作actor编程说明当然没有问题.但是在正式开放中,光传字符串就 ...
- 读paper:Deep Convolutional Neural Network using Triplets of Faces, Deep Ensemble, andScore-level Fusion for Face Recognition
今天给大家带来一篇来自CVPR 2017关于人脸识别的文章. 文章题目:Deep Convolutional Neural Network using Triplets of Faces, Deep ...
- 关于mosquitto_internal.h:40:25:#include <uuid/uuid.h> 致命错误的解决
一.安装mosquitto1.4的时候使用make的时候报以下错误: mosquitto_internal.h:40:25: 致命错误:openssl/ssl.h:没有那个文件或目录 #include ...
- Ionic background地址写法问题
1.背景图片 background:url(‘/img/text.jpg') 这种写法在手机上不好使 ’../img/text.jpg' 这种在手机上好使
- UNIGUI:How to redirect and close session?
Hello, i would have 2 unigui app. the first app is a simple authentification app and second will be ...
- EntityFramework 学习 一 DbContext
上一节中EDM自动生成SchoolEntities类,该类继承DbContext EntityFramework4.1之前的版本,EDM生成的类继承ObjectContext,使用ObjectCont ...
- Docker-Mac安装
1. 下载安装包2. 安装3. 运行,允许docker获得系统权限,它需要将Mac网卡链接至Docker app.4. 验证 打开terminaldocker versionFengZhendeMac ...