坐标轴转化+cdq分治

我们发现那个绝对值不太好搞,于是我们把曼哈顿距离转为切比雪夫距离,x'=x-y,y'=x+y,这样两点之间距离就是max(|x1'-x2'|,|y1'-y2'|),这个距离要小于等于k,那么就是求转化后坐标系中在以x',y'为中心,边长为2k的正方形中的点数,每次修改就相当于加入一个点,计算平面点数就是cdq分治,按时间排序,对x分治,y插入树状数组,然后就做好了

#include<bits/stdc++.h>
using namespace std;
const int N = , base = ;
struct query {
int x, y, opt, minus, id;
query(int x = , int y = , int opt = , int minus = , int id = ) : x(x), y(y), opt(opt), minus(minus), id(id) {}
bool friend operator < (query A, query B) {
return A.x == B.x ? A.id < B.id : A.x < B.x;
}
} q[N << ];
vector<query> c;
int n, Q, cnt, tot, m;
int ans[N], a[N], tree[N << ];
void update(int x, int d) { for(; x <= m; x += x & (-x)) tree[x] += d; }
int ask(int x) { int ret = ; for(; x; x -= x & (-x)) ret += tree[x]; return ret; }
void cdq(int l, int r)
{
if(l >= r) return;
int mid = (l + r) >> ;
cdq(l, mid); cdq(mid + , r);
c.clear();
for(int i = l; i <= mid; ++i) if(q[i].opt == ) c.push_back(q[i]);
for(int i = mid + ; i <= r; ++i) if(q[i].opt == ) c.push_back(q[i]);
sort(c.begin(), c.end());
for(int i = ; i < c.size(); ++i)
{
query o = c[i];
if(o.opt == ) update(o.y, );
else ans[o.id] += ask(o.y) * o.minus;
}
for(int i = ; i < c.size(); ++i) if(c[i].opt == ) update(c[i].y, -);
}
int main()
{
scanf("%d%d", &n, &Q);
for(int i = ; i <= n; ++i)
{
scanf("%d", &a[i]);
q[++cnt] = query(i - a[i], i + a[i] + base, , , );
m = max(m, i + a[i] + base);
}
for(int i = ; i <= Q; ++i)
{
char s[];
int x, y, k;
scanf("%s", s);
if(s[] == 'M')
{
scanf("%d%d", &x, &y);
q[++cnt] = query(x - y, x + y + base, , , ), a[x] = y;
m = max(m, x + y + base);
}
if(s[] == 'Q')
{
scanf("%d%d", &x, &k);
++tot;
m = max(m, x + a[x] + k + base);
q[++cnt] = query(x - a[x] + k, x + a[x] + k + base, , , tot);
q[++cnt] = query(x - a[x] - k - , x + a[x] - k - + base, , , tot);
q[++cnt] = query(x - a[x] - k - , x + a[x] + k + base, , -, tot);
q[++cnt] = query(x - a[x] + k, x + a[x] - k - + base, , -, tot);
}
}
cdq(, cnt);
for(int i = ; i <= tot; ++i) printf("%d\n", ans[i]);
return ;
}

bzoj2989的更多相关文章

  1. 【BZOJ2989】数列(二进制分组,主席树)

    [BZOJ2989]数列(二进制分组,主席树) 题面 BZOJ 权限题啊... Description 给定一个长度为n的正整数数列a[i]. 定义2个位置的graze值为两者位置差与数值差的和,即g ...

  2. 【BZOJ2989】数列(CDQ分治,扫描线)

    [BZOJ2989]数列(CDQ分治) 题面 BZOJ 权.....权限题.. 题解 Description 给定一个长度为n的正整数数列a[i]. 定义2个位置的graze值为两者位置差与数值差的和 ...

  3. 【BZOJ2989】数列 kd-tree

    [BZOJ2989]数列 Description 给定一个长度为n的正整数数列a[i]. 定义2个位置的graze值为两者位置差与数值差的和,即graze(x,y)=|x-y|+|a[x]-a[y]| ...

  4. [bzoj2989]数列_KD-Tree_旋转坐标系

    数列 bzoj-2989 题目大意:题目链接. 注释:略. 想法:显然,我们用x和a[x]两个值建立笛卡尔坐标系. 两个点之间的距离为曼哈顿距离. 修改操作就是插入... 查询操作就是查询一个点周围的 ...

  5. bzoj2989 数列(KDTree)

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

  6. BZOJ2989 数列(二进制分组)

    这题其实可以cdq分治做,但是如果强制在线的话,这里有个牛逼方法叫二进制分组. 它的基本思想是把修改操作按二进制分组,遇到修改就在尾部加一个,并与之前的合并,比如之前有23(16+4+2+1)个,加了 ...

  7. bzoj2989&&4170数列——二进制分组+主席树

    题意的转化挺巧妙的 可以联想到曼哈顿距离! 并且,所谓的修改还要查询历史版本,并且修改之间不动只算一次,不就是给平面上加一个点吗? 看成(x,a[x])的点 就是一个菱形区域 转切比雪夫距离,变成矩形 ...

  8. 2019.01.21 bzoj2989: 数列(二进制分组+主席树)

    传送门 二进制分组入门题. 主席树写错调题2h+2h+2h+体验极差. 题意简述:给一堆点,支持加入一个点,询问有多少个点跟(x,y)(x,y)(x,y)曼哈顿距离不超过kkk. 思路:题目要求的是对 ...

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

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

随机推荐

  1. CURL PHP模拟浏览器get和post

    模拟浏览器get和post数据需要经常用到的类, 在这里收藏了几个不错的方法 方法一 <?php define ( 'IS_PROXY', true ); //是否启用代理 /* cookie文 ...

  2. C语言学习2

    C语言能够进行嵌套备注的方法: #if(0) do { scanf("%d", &n); getchar(); }]||n>a[M-]); #endif

  3. MySQL SQL语句 生成32位 UUID

    在运营中,有时会碰到线下下单,线下注册,需要在数据库对其数据批量生成导入的场景. 此时如果你的数据表主键并不是Int整型自动递增而是32位的UUID这种情况该怎么办呢? MySQL 其实实现了UUID ...

  4. MySQL最优配置文件模板·2016-11-28

    小伙伴们大爱的MySQL最优配置文件模板更新啦.对之前的MySQL最优配置文件·20160901做了一些修正,更为名至实归.可以通过此链接进行下载.当然,更欢迎同学们提出意见和建议,共同打造一个最优M ...

  5. MTK android L使用汇顶TP如何使用B协议

    使用B协议上报之前的代码: #include "tpd.h" #include "tpd_custom_gt9xx.h" #ifndef TPD_NO_GPIO ...

  6. 使用MediaPlayer播放、暂停、停止音乐

    package com.pingyijinren.test; import android.media.MediaPlayer; import android.os.Environment; impo ...

  7. MySQL集群之五大常见的MySQL高可用方案(转)

    1. 概述 我们在考虑MySQL数据库的高可用的架构时,主要要考虑如下几方面: 如果数据库发生了宕机或者意外中断等故障,能尽快恢复数据库的可用性,尽可能的减少停机时间,保证业务不会因为数据库的故障而中 ...

  8. 英特尔固态盘 说明书PDF

    http://www.intel.cn/content/www/cn/zh/solid-state-drives/solid-state-drives-ssd.html

  9. springboot整体介绍

    1.springboot:快速开发,强大的运维能力.(监控,服务发现,并打) 2.微服务,将一个大系统分解成很多独立的小服务,这些服务能随时发布. 3.2004年第一版spring 1.0,rod j ...

  10. 将mysql数据库数据导出为.sql文件

    打开Navicat ,在我们要到处的数据上面右击鼠标,然后弹出的快捷菜单上点击“转储SQL 文件”,在再次弹出的子菜单项中选择第一个“数据跟结构”.