【BZOJ2989】数列 kd-tree
【BZOJ2989】数列
Description
Input
Output
对于每次询问操作,输出一个非负整数表示答案
Sample Input
2 4 3
Query 2 2
Modify 1 3
Query 2 2
Modify 1 2
Query 1 1
Sample Output
3
3
HINT
N<=60000 修改操作数<=40000 询问<=50000 Max{a[i]}含修改<=100000
题解:新技能:旋转坐标系。就是将一个斜着的正方形变成横着的,只需要将所有点(x,y)变成(x+y,y-x)即可。
然后就变成了查询所有满足一下条件的点:l<=x<=r,l<=y<=r,加入时间<=询问时间。直接上三维kd-tree就好了。
本机实测一个点8s+然而提交上去5s就A了是什么鬼~
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define D1 ((D+1)%3)
#define D2 ((D+2)%3)
#define rep for(int i=0;i<=2;i++)
using namespace std;
const int maxn=100010;
struct kd
{
int v[3],sm[3],sn[3],siz,ls,rs;
kd (){}
int & operator [] (int x) {return v[x];}
kd (int a,int b,int c) {v[0]=sm[0]=sn[0]=a,v[1]=sm[1]=sn[1]=b,v[2]=sm[2]=sn[2]=c,siz=1,ls=rs=0;}
};
kd t[maxn];
int n,m,D,tot,ans,root,cnt;
int qx[maxn],qk[maxn],X[maxn],Y[maxn],Z[maxn],head[maxn],rm[3],rn[3];
bool cmp(kd a,kd b)
{
return (a[D]==b[D])?((a[D1]==b[D1])?(a[D2]<b[D2]):(a[D1]<b[D1])):(a[D]<b[D]);
}
int rd()
{
int ret=0,f=1; char gc=getchar();
while(gc<'0'||gc>'9') {if(gc=='-')f=-f; gc=getchar();}
while(gc>='0'&&gc<='9') ret=ret*10+gc-'0',gc=getchar();
return ret*f;
}
void pushup(int x,int y)
{
t[x].siz+=t[y].siz;
rep t[x].sm[i]=max(t[x].sm[i],t[y].sm[i]),t[x].sn[i]=min(t[x].sn[i],t[y].sn[i]);
}
int build(int l,int r,int d)
{
if(l>r) return 0;
D=d;
int mid=l+r>>1;
nth_element(t+l,t+mid,t+r+1,cmp);
t[mid].ls=build(l,mid-1,(d+1)%3),t[mid].rs=build(mid+1,r,(d+1)%3);
if(t[mid].ls) pushup(mid,t[mid].ls);
if(t[mid].rs) pushup(mid,t[mid].rs);
return mid;
}
int getmin(int x)
{
int ret=0;
rep ret|=(t[x].sm[i]<rn[i]||t[x].sn[i]>rm[i]);
return !ret;
}
int getmax(int x)
{
int ret=1;
rep ret&=(t[x].sm[i]<=rm[i]&&t[x].sn[i]>=rn[i]);
return ret;
}
int check(int x)
{
int ret=1;
rep ret&=(t[x].v[i]<=rm[i]&&t[x].v[i]>=rn[i]);
return ret;
}
void query(int x)
{
if(!x||!getmin(x)) return ;
if(getmax(x))
{
ans+=t[x].siz;
return ;
}
if(check(x)) ans++;
query(t[x].ls),query(t[x].rs);
}
char str[10];
int main()
{
n=rd(),m=rd();
int i,a,b;
for(i=1;i<=n;i++) a=i,b=rd(),X[i]=a+b,Y[i]=b-a,Z[i]=0,head[i]=i;
for(tot=n,i=1;i<=m;i++)
{
scanf("%s",str);
if(str[0]=='M') a=rd(),b=rd(),X[++tot]=a+b,Y[tot]=b-a,Z[tot]=i,head[a]=tot;
else qx[i]=head[rd()],qk[i]=rd();
}
for(i=1;i<=tot;i++) t[i]=kd(X[i],Y[i],Z[i]);
root=build(1,tot,0);
for(i=1;i<=m;i++)
{
if(qx[i])
{
rm[0]=X[qx[i]]+qk[i],rn[0]=X[qx[i]]-qk[i];
rm[1]=Y[qx[i]]+qk[i],rn[1]=Y[qx[i]]-qk[i];
rm[2]=i,rn[2]=0;
ans=0,query(root),printf("%d\n",ans);
}
}
return 0;
}
【BZOJ2989】数列 kd-tree的更多相关文章
- AOJ DSL_2_C Range Search (kD Tree)
Range Search (kD Tree) The range search problem consists of a set of attributed records S to determi ...
- k-d tree 学习笔记
以下是一些奇怪的链接有兴趣的可以看看: https://blog.sengxian.com/algorithms/k-dimensional-tree http://zgjkt.blog.uoj.ac ...
- 【BZOJ-2648&2716】SJY摆棋子&天使玩偶 KD Tree
2648: SJY摆棋子 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 2459 Solved: 834[Submit][Status][Discu ...
- K-D Tree
这篇随笔是对Wikipedia上k-d tree词条的摘录, 我认为解释得相当生动详细, 是一篇不可多得的好文. Overview A \(k\)-d tree (short for \(k\)-di ...
- K-D Tree题目泛做(CXJ第二轮)
题目1: BZOJ 2716 题目大意:给出N个二维平面上的点,M个操作,分为插入一个新点和询问到一个点最近点的Manhatan距离是多少. 算法讨论: K-D Tree 裸题,有插入操作. #inc ...
- k-d Tree in TripAdvisor
Today, TripAdvisor held a tech talk in Columbia University. The topic is about k-d Tree implemented ...
- k-d tree算法
k-d树(k-dimensional树的简称),是一种分割k维数据空间的数据结构.主要应用于多维空间关键数据的搜索(如:范围搜索和最近邻搜索). 应用背景 SIFT算法中做特征点匹配的时候就会利用到k ...
- k-d tree模板练习
1. [BZOJ]1941: [Sdoi2010]Hide and Seek 题目大意:给出n个二维平面上的点,一个点的权值是它到其他点的最长距离减最短距离,距离为曼哈顿距离,求最小权值.(n< ...
- [模板] K-D Tree
K-D Tree K-D Tree可以看作二叉搜索树的高维推广, 它的第 \(k\) 层以所有点的第 \(k\) 维作为关键字对点做出划分. 为了保证划分均匀, 可以以第 \(k\) 维排名在中间的节 ...
- BZOJ3489 A simple rmq problem K-D Tree
传送门 什么可持久化树套树才不会写呢,K-D Tree大法吼啊 对于第\(i\)个数,设其前面最后的与它值相同的位置为\(pre_i\),其后面最前的与它值相同的位置为\(aft_i\),那么对于一个 ...
随机推荐
- Hibernate search与Lucene包异常学习心得
最近使用了了一下Hibernate Search这个组件 这个组件是对域模型进行全文检索,在全文检索的底层实现上使用了Lucene技术 在进行小测试的时候费了很大的力气去搞定包的问题 我直接通过实例 ...
- 提升开发效率的一款mybatis开发神器
文末附有完整案例的代码内容!! 以前在开发的时候,使用mybatis的时候,经常都需要先配置xml映射文件,然后每条sql操作都需要自己进行手动编写,对于一些复杂的sql这么来操作确实有必要,但是如果 ...
- ByteBuffer的介绍
转摘 有一个问题需要明确:为什么要使用bytebuffer,它比byte比起来有什么优点? 很简单:为了提高IO的效率.怎样提高的,这个还得google一下. 记住几个标志的含义:position[0 ...
- Linux下Shell脚本字符串单引号、双引号、反引号、反斜杠的作用和区别
一.单引号 str='this is a string' 单引号字符串的限制: 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的: 单引号字串中不能出现单引号(对单引号使用转义符后也不行) ...
- IOS7开发~NSAttributedString
从 NSBundle 中读取rtf文本文件的内容,然后用UITextView展示: NSURL *url = [[NSBundle mainBundle] URLForResource:@" ...
- 【iOS】Frame和Bounds的区别以及获取绝对坐标的办法
终于搞清楚了,UIView中的frame获取的是相对于所在ParentView的坐标,而bounds则是指UIView本身的坐标.比如下图(假设A是屏幕): View B的Frame坐标是指相对于Vi ...
- context:exclude-filter spring事宜【经典-转】
context:exclude-filter spring事务 如果带上事务,那么用annotation方式的事务注解和bean配置,事务会失效,要将service bean配置到xml文件中才行. ...
- Mark一下, dp状态转移方程写对,可是写代码都错,poj 1651 poj 1179
dp题: 1.写状态转移方程; 2.考虑初始化边界,有意义的赋定值.还没计算的赋边界值: 3.怎么写代码自底向上计算最优值 今天做了几个基础dp,所有是dp方程写对可是初始化以及计算写错 先是poj ...
- 性能测试报告模板 V1.0
1. 测试项目概述与测试目的 1.1 项目概述 本部分主要是针对即将进行压力测试的对象(接口.模块.进程或系统)进行概要的说明,让人明白该测试对象的主要功能与作用及相关背景. 1.2 测试目标 简要列 ...
- @Cacheable注解在spring3中的使用-实现缓存
转: http://blog.csdn.net/chenleixing/article/details/44815443 在软件开发中使用缓存已经有一个非常久的历史了.缓存是一种很好的设计思想,一旦 ...