坐标轴转化+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. jmeter 接口测试

    web接口测试工具: 手工测试的话可以用postman ,自动化测试多是用到 Jmeter(开源).soupUI(开源&商业版). 下面将对前一篇Postman做接口测试中的接口用Jmeter ...

  2. Rim 边缘光

    边缘光:计算眼睛和模型顶点法线的点积,结果作为强度,和材质输出:顶点和法线平行时,强度最大,垂直时,强度最小.因此将他取反,即同一方向时,强度最小,垂直时,强度最大. -dot(normalize(v ...

  3. ABC077翻车实况

    今天强行打一波ABC,想作为信心赛,然而= = T1  日常练习读入&输出 T2  $STL$大法好,$sqrt$保平安,我强行递推$WA$了一圈,然后罚时++ T3  woc好难啊,$n=1 ...

  4. [luoguP1019] 单词接龙(DFS)

    传送门 不知为什么,判断全部包含反而A不了,不判断反而A了,╮(╯▽╰)╭ 代码 #include <cstdio> #include <iostream> #define m ...

  5. hdu1978

          {          scanf(          {         scanf(         ;i<n;i++) ;j<m;j++)         scanf(   ...

  6. hdu 4430 二分+枚举

    /* 二分+枚举 枚举k会超时,枚举r还要优化,有可能会超64 */ #include<stdio.h> #include<math.h> #define ll __int64 ...

  7. 被老板逼着实现了Excle的透视表分析算法

    package com.example.demo; import java.sql.SQLException;import java.util.ArrayList;import java.util.H ...

  8. [Nescafé 20] 玉蟾宫

    ★   输入文件:jademoon.in   输出文件:jademoon.out   简单对比 时间限制:1 s   内存限制:128 MB [背景] 有一天,小猫rainbow和freda来到了湘西 ...

  9. cdq分治入门--BZOJ1492: [NOI2007]货币兑换Cash

    n<=100000天,一开始有s块钱,每天股票A价格ai,B价格bi,每天可以做的事情:卖出股票:按A:B=RTi的比例买入股票.问最后的最大收益.股票可以为浮点数,答案保留三位. 用脚指头想想 ...

  10. 解决Android Studio2.0不能使用HttpClient

    在build.gradle中的android {}中加上useLibrary 'org.apache.http.legacy'