传送门

BZOJ上的题目没有题面……



【样例输入】

3 5

2 4 3

Query 2 2

Modify 1 3

Query 2 2

Modify 1 2

Query 1 1

【样例输出】

2

3

3

这道题稍微分析一下就知道是求一个一个点曼哈顿距离小于k的的范围内的点的个数(把下标看做x,把值看做y)。然后我们只需要旋转一下坐标轴就变成了和“Mokia”或“简单题”一样的CDQ分治裸题了,求二维空间前缀和。

首先将询问按x排序,然后开始分治过程,计算左半区间对右半区间的贡献,然后就写完了呀!

然后是树套树做法,这个就更Naive了呀,直接套,反正就是求区间前缀和,乱搞搞就A了(不知道为什么对内存的需求不对啊……)。

CDQ版:

#include <cstdio>
#include <algorithm>
#include <iostream>
#include <assert.h>
#define LL int
#define MAXM 300005
#define MAXN 100005
using namespace std;
int a[MAXN];
LL ans[MAXN];
inline int Min(int a, int b) { return a < b ? a : b; }
struct Querys{
int t, x, y, v, k; Querys(){}
Querys(int a, int b, int c, int d, int e):t(a),x(b),y(c),v(d),k(e){}
inline bool operator < (const Querys &r) const {
if(x == r.x && y == r.y) return t < r.t;
else if(x == r.x) return y < r.y;
else return x < r.x;
}
} q[MAXM], nq[MAXM];
int n, m, cnt = 0, qn, N;
inline void GET(int &n) {
char c; n = 0;
do c=getchar(); while('0' > c || c > '9');
do n=n*10+c-'0',c=getchar(); while('0' <= c && c <= '9');
}
namespace BIT {
LL t[MAXM];
inline void Add(int x, int v) {
for(; x <= N; x += x&-x) t[x] += v;
}
inline LL Q(int x, LL sum = 0) {
for(; x; x -= x&-x) sum += t[x];
return sum;
}
}
void cdq(int L, int R) {
if(L >= R) return;
using namespace BIT;
int mid = (L + R) >> 1, lp = L, rp = mid+1;
for(int i = L; i <= R; ++ i)
if(q[i].t <= mid && q[i].k == 2) Add(q[i].y, 1);
else if(q[i].t > mid && q[i].k != 2) ans[q[i].v] += Q(q[i].y) * q[i].k;
for(int i = L; i <= R; ++ i) {
if(q[i].t <= mid && q[i].k == 2) Add(q[i].y, -1);
if(q[i].t <= mid) nq[lp ++] = q[i];
else nq[rp ++] = q[i];
}
for(int i = L; i <= R; ++ i) q[i] = nq[i];
cdq(L, mid); cdq(mid+1, R);
}
int main() {
GET(n); GET(m); N = 300000;
for(int i = 1; i <= n; ++ i) {
GET(a[i]);
q[++ cnt] = Querys(cnt, i + a[i], a[i] - i + 160000, 0, 2);
}
char op[10]; int u, v;
for(int i = 1; i <= m; ++ i) {
scanf("%s", op);
GET(u); GET(v);
if('M' == op[0]) {
a[u] = v;
q[++ cnt] = Querys(cnt, u + v, v - u + 160000, 0, 2);
}
else {
++ qn; assert(a[u]-u-v+160000-1 > 0);
if(u+a[u]-v-1 > 0) q[++ cnt] = Querys(cnt, (u+a[u]-v-1), Min(a[u]-u+v+160000, N), qn, -1);
if(u+a[u]-v-1 > 0) q[++ cnt] = Querys(cnt, (u+a[u]-v-1), Min(a[u]-u-v+160000-1,N), qn, 1);
q[++ cnt] = Querys(cnt, (u+a[u]+v), Min(a[u]-u+v+160000,N), qn, 1);
q[++ cnt] = Querys(cnt, (u+a[u]+v), Min(a[u]-u-v+160000-1,N), qn, -1);
}
}
sort(q+1, q+cnt+1);
cdq(1, cnt);
for(int i = 1; i <= qn; ++ i)
printf("%d\n", ans[i]);
return 0;
}

树套树版:

#include <cstdio>
#define MAXN 1000005
inline void GET(int &n) {
char c, f = 1; n = 0;
do if((c=getchar()) == '-') f = -1; while('0' > c || c > '9');
do n=n*10+c-'0',c=getchar(); while('0' <= c && c <= '9');
n *= f;
}
unsigned fix[MAXN * 20], sd = 2333;
int key[MAXN * 20], s[MAXN * 20][2], sz[MAXN * 20], rt[MAXN], cnt, n, m, N, a[MAXN], num[MAXN];
inline unsigned ran() { return sd = sd * sd + sd^27873; }
inline void pushup(int x) {
sz[x] = sz[s[x][0]] + sz[s[x][1]] + num[x];
}
inline void rot(int &x, bool f) {
int t = s[x][f]; s[x][f] = s[t][f^1]; s[t][f^1] = x;
pushup(x); pushup(t); x = t;
}
void Insert(int &x, int v) {
if(!x) { x = ++ cnt; fix[x] = ran(); num[x] = sz[x] = 1; key[x] = v; return; }
if(v == key[x]) { ++ num[x]; pushup(x); return; }
bool f = key[x] < v;
Insert(s[x][f], v); pushup(x);
if(fix[s[x][f]] > fix[x]) rot(x, f);
} int u, v, i;
int Rank(int x, int v) {
if(!x) return 0;
if(key[x] < v) return sz[x] - sz[s[x][1]] + Rank(s[x][1], v);
else if(key[x] > v) return Rank(s[x][0], v);
else return sz[x] - sz[s[x][1]];
}
void Ins(int x, int v) {
for(; x <= N; x += x&-x)
Insert(rt[x], v);
}
int Q(int x, int y) {
int sum = 0;
for(; x > 0; x -= x&-x)
sum += Rank(rt[x], y);
return sum;
}
int main() {
GET(n); GET(m); N = 2*n + 100000;
for(int i = 1; i <= n; ++ i) {
GET(a[i]); Ins(i+a[i], a[i]-i);
}
char op[10];
for(i = 1; i <= m; ++ i) {
scanf("%s", op);
GET(u); GET(v);
if('M' == op[0]) {
a[u] = v; Ins(u+a[u], a[u]-u);
}
else {
int ans = Q((u+a[u]+v), a[u]-u+v) - Q((u+a[u]-v-1), a[u]-u+v) - Q((u+a[u]+v), a[u]-u-v-1) + Q((u+a[u]-v-1), a[u]-u-v-1);
printf("%d\n", ans);
}
}
return 0;
}

BZOJ4170 极光(CDQ分治 或 树套树)的更多相关文章

  1. BZOJ4170:极光(CDQ分治)

    Description "若是万一琪露诺(俗称rhl)进行攻击,什么都好,冷静地回答她的问题来吸引她.对方表现出兴趣的话,那就慢慢地反问.在她考虑答案的时候,趁机逃吧.就算是很简单的问题,她 ...

  2. 【Bzoj 3295】 动态逆序对(树套树|CDQ分治)

    [题意] 每次删除一个数,然后问删除前逆序对数. [分析] 没有AC不开心.. 我的树状数组套字母树,应该是爆空间的,空间复杂度O(nlogn^2)啊..哭.. 然后就没有然后了,别人家的树套树是树状 ...

  3. bzoj3110: [Zjoi2013]K大数查询 【cdq分治&树套树】

    模板题,折腾了许久. cqd分治整体二分,感觉像是把询问分到答案上. #include <bits/stdc++.h> #define rep(i, a, b) for (int i = ...

  4. bzoj 3295: [Cqoi2011]动态逆序对(树套树 or CDQ分治)

    Description 对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对(i,j)的个数.给1到n的一个排列,按照某种顺序依次删除m个元素,你的任务是在每次删除一个元素之前统计 ...

  5. [BZOJ3295][Cqoi2011]动态逆序对 CDQ分治&树套树

    3295: [Cqoi2011]动态逆序对 Time Limit: 10 Sec  Memory Limit: 128 MB Description 对于序列A,它的逆序对数定义为满足i<j,且 ...

  6. Codechef-ANCESTOR(树套树/CDQ分治)

    题意: 给定两棵有根树,各有 N 个点.两棵树上的点分别被从 1 到 N 标号.两棵树的根均为标号为 1 的节点. 你的任务非常简单:对于每个 i,找到一个 j(j != i),使得在两棵树中 j 都 ...

  7. BZOJ 3262 cdq分治 OR 树套树

    注意判断 三个条件都一样的-- (CDQ分治 其实并不是很难理解 只是想不到--) CDQ分治: //By SiriusRen #include <cstdio> #include < ...

  8. 2019南昌网络赛-I. Yukino With Subinterval 线段树套树状数组,CDQ分治

    TMD...这题卡内存卡的真优秀... 所以以后还是别用主席树的写法...不然怎么死的都不知道... 树套树中,主席树方法开权值线段树...会造成空间的浪费...这道题内存卡的很紧... 由于树套树已 ...

  9. [Bzoj3262]陌上花开(CDQ分治&&树状数组||树套树)

    题目链接 题目就是赤裸裸的三维偏序,所以用CDQ+树状数组可以比较轻松的解决,但是还是树套树好想QAQ CDQ+树状数组 #include<bits/stdc++.h> using nam ...

随机推荐

  1. Python scipy.sparse矩阵使用方法

    本文以csr_matrix为例来说明sparse矩阵的使用方法,其他类型的sparse矩阵可以参考https://docs.scipy.org/doc/scipy/reference/sparse.h ...

  2. 全球首个全流程跨平台界面开发套件,PowerUI分析

    一.       首个全流程跨平台界面开发套件,PowerUI正式发布 UIPower在DirectUI的基础上,自主研发全球首个全流程跨平台界面开发套件PowerUI(PUI)正式发布,PowerU ...

  3. oracle表结构和表内容差异比对

    oracle表结构和表内容差异比对 oracle中有三种集合操作,他们会把左边和右边的select 结果集进行集合操作. union 并集 intersect 交集 minus 差集 假设有如下两张表 ...

  4. 关于iOS10 Xcode8真机测试项目出现的问题 "code signing is required for product type 'xxxxx' in SDK 'iOS 10.0"..

    昨天用真机测试项目出现这样的错误,在网上搜集了一些信息,所以将自己的经验分享出来帮助更多的人. 第一步: 检查你的1和2是否填写正确,如果你是运行别人的项目,BundleIdentifier要和你的X ...

  5. 使用PS过程

    1. 设置图层背景色和前景色 设置背景色和前景色方法类似,下面以设置背景色为例说明.方法一:使用色板设置图片背景色第一步:单击"文件"菜单,选择"新建文档",这 ...

  6. exit

    -------siwuxie095 三个退出命令: exit exit /b goto :eof 这三个命令都可以退出批处理,但之间有细微差别: (1)运行 GOTO :EOF 后,CMD返回并将等待 ...

  7. C#中的问号

    本人转载自: ①http://msdn.microsoft.com/zh-cn/practices/dd391752.aspx ②http://jhxk.iteye.com/blog/439888 在 ...

  8. 选择流程—— switch if else结构

    一.switch switch(表达式){ case 常量1: 语句; break; case 常量2: 语句; break; … default; 语句; } 例题:运用switch结构实现购物管理 ...

  9. jQuery插件编写笔记

    插件的种类: 1.封装对象方法的插件. 2.封装全局函数的插件. 3.选择器插件. *所有的对象方法都应当附加到jQuery.fn对象上,而所有的全局函数都应当附加到jQuery对象本身上. *在插件 ...

  10. Daily Scrum 12.15

    今日完成任务: 完成关于主页右侧资源显示的算法优化:解决了下载资源时的异常. 遇到困难: 编译课设这周要检查,小组成员的大部分时间在完成编译课设,时间很紧. 明日任务: 孙思权 完成第二组提供的数据库 ...