数列 bzoj-2989

题目大意:题目链接。

注释:略。


想法:显然,我们用x和a[x]两个值建立笛卡尔坐标系。

两个点之间的距离为曼哈顿距离。

修改操作就是插入...

查询操作就是查询一个点周围的斜正方形的点数。

而斜正方形的复杂度是没有办法保证的。

所以,我们旋转坐标系。

每个点都变成了$\frac{x+y}{\sqrt{2}}$和$\frac{x-y}{\sqrt{2}}$。

有根号我们没有办法处理,所以我们直接乘以根号2。

乘完了之后,旋转后的坐标系上两个点之间的切比雪夫距离就等于原来的曼哈顿距离。

所以我们直接查询周围的正方形即可。

最后,附上丑陋的代码... ...

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define N 100010
using namespace std;
int d,root,g[N];
struct Node
{
int c[2],minn[2],p[2],maxn[2],sum;
}a[N];
inline void pushup(int x)
{
int ls=a[x].c[0],rs=a[x].c[1];
a[x].minn[0]=min(a[x].p[0],min(a[ls].minn[0],a[rs].minn[0]));
a[x].minn[1]=min(a[x].p[1],min(a[ls].minn[1],a[rs].minn[1]));
a[x].maxn[0]=max(a[x].p[0],max(a[ls].maxn[0],a[rs].maxn[0]));
a[x].maxn[1]=max(a[x].p[1],max(a[ls].maxn[1],a[rs].maxn[1]));
a[x].sum=a[ls].sum+a[rs].sum+1;
}
inline bool cmp(const Node &a,const Node &b)
{
return a.p[d]==b.p[d]?a.p[d^1]<b.p[d^1]:a.p[d]<b.p[d];
}
int build(int l,int r,int now)
{
int mid=(l+r)>>1;
d=now; nth_element(a+l,a+mid,a+r+1,cmp);
a[mid].minn[0]=a[mid].maxn[0]=a[mid].p[0];
a[mid].minn[1]=a[mid].maxn[1]=a[mid].p[1];
a[mid].c[0]=a[mid].c[1]=0;
if(l<mid) a[mid].c[0]=build(l,mid-1,now^1);
if(mid<r) a[mid].c[1]=build(mid+1,r,now^1);
pushup(mid);
return mid;
}
void insert(int &k , int x)
{
if(!k) k=x;
else if(a[k].p[d]<a[x].p[d]||(a[k].p[d]==a[x].p[d]&&a[k].p[d^1]<a[x].p[d^1])) d^=1,insert(a[k].c[0],x);
else d^=1,insert(a[k].c[1],x);
pushup(k);
}
inline int judge(int k,int x1,int y1,int x2,int y2)
{
if(!k||a[k].maxn[0]<x1||a[k].maxn[1]<y1||a[k].minn[0]>x2||a[k].minn[1]>y2) return -1;
if(a[k].minn[0]>=x1&&a[k].maxn[0]<=x2&&a[k].minn[1]>=y1&&a[k].maxn[1]<=y2) return 1;
return 0;
}
int query(int k,int x1,int y1,int x2,int y2)
{
int opt=judge(k,x1,y1,x2,y2);
if(opt==1) return a[k].sum;
if(opt==-1) return 0;
int ans=(a[k].p[0]>=x1&&a[k].p[1]>=y1&&a[k].p[0]<=x2&&a[k].p[1]<=y2);
return ans+query(a[k].c[0],x1,y1,x2,y2)+query(a[k].c[1],x1,y1,x2,y2);
}
int main()
{
char str[10];
a[0].maxn[0]=a[0].maxn[1]=-1<<30,a[0].minn[0]=a[0].minn[1]=1<<30;
int n,m,x,y;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++) scanf("%d",&g[i]),a[i].p[0]=i-g[i],a[i].p[1]=i+g[i];
root=build(1,n,0);
for(int i=1;i<=m;i++)
{
scanf("%s%d%d",str,&x,&y);
if(str[0]=='M')g[x]=y,a[++n].p[0]=x-y,a[n].p[1]=x+y,insert(root,n);
else printf("%d\n",query(root,x-g[x]-y,x+g[x]-y,x-g[x]+y,x+g[x]+y));
}
return 0;
}

小结:笛卡尔坐标系上的曼哈顿距离等于顺时针45的笛卡尔坐标系上的切比雪夫距离。

[bzoj2989]数列_KD-Tree_旋转坐标系的更多相关文章

  1. 【bzoj2989】数列 KD-tree+旋转坐标系

    题目描述 给定一个长度为n的正整数数列a[i]. 定义2个位置的graze值为两者位置差与数值差的和,即graze(x,y)=|x-y|+|a[x]-a[y]|. 2种操作(k都是正整数): 1.Mo ...

  2. bzoj2989 数列(KDTree)

    bzoj2989 数列(KDTree) bzoj 该说不愧是咱,一个月才水一篇题解然后还水的一批 题目描述: 给定一个长度为n的正整数数列a[i]. 定义2个位置的graze值为两者位置差与数值差的和 ...

  3. VPython—旋转坐标系

    使用arrow( )创建三个坐标轴代表一个坐标系,其中X0-Y0-Z0为参考坐标系(固定不动),X-Y-Z为运动坐标系,这两个坐标系原点重合,运动坐标系可以绕参考坐标系或其自身旋转.在屏幕上输出一个转 ...

  4. 【bzoj3170】[Tjoi 2013]松鼠聚会 旋转坐标系

    题目描述 有N个小松鼠,它们的家用一个点x,y表示,两个点的距离定义为:点(x,y)和它周围的8个点即上下左右四个点和对角的四个点,距离为1.现在N个松鼠要走到一个松鼠家去,求走过的最短距离. 输入 ...

  5. [SDOI2018]物理实验 set,扫描线,旋转坐标系

    [SDOI2018]物理实验 set,扫描线,旋转坐标系 链接 loj 思路 先将导轨移到原点,然后旋转坐标系,参考博客. 然后分线段,每段的贡献(三角函数值)求出来,用自己喜欢的平衡树,我选set. ...

  6. HDU 6538 Neko and quadrilateral(极角排序+旋转坐标系)

    这道题简直太好了,对于计算几何选手需要掌握的一个方法. 首先对于求解四边形面积,我们可以将四边形按对角线划分成两个三角形,显然此时四边形的面积最大最小值就变成了求解里这个对角线最近最远的点对. 对于此 ...

  7. Android canvas rotate():平移旋转坐标系至任意原点任意角度-------附:android反三角函数小结

    自然状态下,坐标系以屏幕左上角为原点,向右是x正轴,向下是y正轴.现在要使坐标系的原点平移至任一点O(x,y),且旋转a角度,如何实现? 交待下我的问题背景,已知屏幕上有两点p1和p2,构成直线l.我 ...

  8. [bzoj1500][NOI2005]维修数列_非旋转Treap

    维修数列 bzoj-1500 NOI-2005 题目大意:给定n个数,m个操作,支持:在指定位置插入一段数:删除一个数:区间修改:区间翻转.查询:区间和:全局最大子序列. 注释:$1\le n_{ma ...

  9. hdu4998 旋转坐标系

    题意:       一开始的时候有一个坐标系(正常的),然后有n个操作,每个操作是 x y d,意思是当前坐标系围绕x,y点逆时针旋转d度,最后让你输出三个数x y d,把这n个操作的最后结果,用一步 ...

随机推荐

  1. PCB 所建不凡 AWS 技术峰会2018 • 深圳站 2018.9.20

    在去[AWS 技术峰会2018 • 深圳站]之提前并没有AWS提前做功课,主要PCB这行业基本自己搭服务器搭应用,不会买云服务器.由于没用过企业级的云服务器,对云这方面还是了解还是非常有限的. 市面上 ...

  2. cookie封装函数(添加,获取,删除)

    <!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>& ...

  3. Gym - 101972B Arabella Collegiate Programming Contest (2018) B. Updating the Tree 树DFS

    题面 题意:T组数据,每次给你1e5个点的树(1为根),每个点有一权值,询问1-n每个节点的子树中, 至少修改几个点的权值(每次都可以任意修改),才能让子树中任意2点的距离==他们权值差的绝对值 无解 ...

  4. [Apple开发者帐户帮助]九、参考(4)支持的功能(macOS)

    macOS应用程序可用的功能取决于您的程序成员身份和签名证书. 能力 ADP 开发者ID Apple开发者 应用程序组 App沙盒 游戏中心     硬化运行时 iCloud:CloudKit   i ...

  5. JS属性defer

      其实就是简单的利用defer属性,让浏览器读JS脚本的时候完全不等脚本开始读就开始读下面的图片啊,html代码了.然后让js脚本自己在那里慢慢读取完以后再执行. 给外链的js脚本添加defer=& ...

  6. JavaScript中相等==和严格相等===的区别

    在JavaScipt中==(相等)和===(严格相等,strick equality 也有译作“恒等”.“全等”)用于比较两个值是否相等,两个运算符允许任意类型的操作数.如果操作数相等则返回true, ...

  7. scrapy安装及基本使用

    前端html, css, js 相关知识 数据库运用 http协议的了解 前后台联动 蜘蛛中间件.下载中间件 下载中间件的地方可以写各种反爬的策略 1.使用pip安装, pip3 install sc ...

  8. ACM_出题人这样不好吧

    出题人这样不好吧 Time Limit: 2000/1000ms (Java/Others) Problem Description: 作为编协的第一次月赛,肯定是要有防AK(ALL KILL)的题目 ...

  9. Kibana里No Marvel Data Found问题解决(图文详解)

    问题详情 http://192.168.80.145:5601/app/marvel#/no-data?_g=(refreshInterval:(display:'10%20seconds',paus ...

  10. eclipse 安装svn插件记录

    每个人都有自己喜欢的和习惯的一套开发环境,其中对于喜欢用eclipse的同学来说.subclipse插件可以说是必不可少的插件了. 他的安装有两种方法,一种是在线安装.然而这种安装实在是太慢了,无法忍 ...