坐标轴转化+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. pycharm中提交Git 忽略部分代码

    痛点: 项目中,有些配置项,或者比较隐私的东东,不想上传 解决:在项目根路径下,创建.gitignore 文件     文件中可以写文件名.文件路径等 结果: 提交到git,发现果真没有dbconne ...

  2. Jquery validate自定义验证

    http://www.runoob.com/jquery/jquery-plugin-validate.html addMethod(name,method,message)方法 参数 name 是添 ...

  3. 洛谷 1850 NOIP2016提高组 换教室

    [题解] 先用floyed处理出两点间的最短路. 设f[i][j][k]表示走到第i个教室,总共换了j次,当前换或者不换,期望的最小移动距离. 分情况讨论来转移即可. #include<cstd ...

  4. 2017icpc 西安 XOR

    XOR Consider an array AAA with n elements . Each of its element is A[i]A[i]A[i] (1≤i≤n)(1 \le i \le ...

  5. restful(1):序列化

    restful协议中,一切皆是资源,操作只是请求方式 model_to_dict()方法: from django.forms.models import model_to_dict obj = Pu ...

  6. Spring Boot为我们准备了最佳的数据库连接池方案,只需要在属性文件(例如application.properties)中配置需要的连接池参数即可。

    Spring Boot为我们准备了最佳的数据库连接池方案,只需要在属性文件(例如application.properties)中配置需要的连接池参数即可.

  7. 获取select 选中的option中自定义的名称的之

    <select style="width: 220px;height: 20px;margin: 0 0 0 20px;" id="invest_ticket&qu ...

  8. Lua:ipairs和pairs的区别

    ipairs 和pairs在lua中都是遍历tbale的函数但是两者有区别 1.pairs遍历table中的所有的key-vale 而ipairs会根据key的数值从1开始加1递增遍历对应的table ...

  9. [Web Analytics] Into to Web Analytics

    Just to get started for myself. Any developer who doesn't care about the business is not a good soft ...

  10. script标签async和defer的区别及作用

    作用: 1.没有 defer 或 async,浏览器会立即加载并执行指定的脚本,也就是说不等待后续载入的文档元素,读到就加载并执行. 2.async 属性表示异步执行引入的 JavaScript,与 ...