这题其实可以cdq分治做,但是如果强制在线的话,这里有个牛逼方法叫二进制分组。

它的基本思想是把修改操作按二进制分组,遇到修改就在尾部加一个,并与之前的合并,比如之前有23(16+4+2+1)个,加了一个后就变成了24(16+8)个,遇到查询就在每个组内查询,再加起来就好了。

#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
#define M ((l+r)>>1)
#define mk(a,b) make_pair(a,b) typedef pair<int,int> pr;
const int N=,A=N+;
char op[];
int n,q,x,y,tt,tp,a[N],rt[][],rb[],vs[];
vector<pr> v[];
struct nd {int l,r,s;}t[]; void ins2(int &x,int ls,int l,int r,int v) {
t[x=rb[tt--]].s=t[ls].s+,vs[x]=;
if(l==r) return;
if(v<=M) t[x].r=t[ls].r,ins2(t[x].l,t[ls].l,l,M,v);
else t[x].l=t[ls].l,ins2(t[x].r,t[ls].r,M+,r,v);
}
int qr2(int x,int y,int l,int r,int L,int R) {
if(L<=l&&R>=r) return t[x].s-t[y].s;
if(R<=M) return qr2(t[x].l,t[y].l,l,M,L,R);
if(L>M) return qr2(t[x].r,t[y].r,M+,r,L,R);
return qr2(t[x].l,t[y].l,l,M,L,R)+qr2(t[x].r,t[y].r,M+,r,L,R);
}
void dl(int x,int l,int r) {
if(vs[x]) return;
rb[++tt]=x,vs[x]=,dl(t[x].l,l,M),dl(t[x].r,M+,r),t[x].s=t[x].l=t[x].r=;
} void ins(int x,int y) {
v[++tp].push_back(mk(x,y)),ins2(rt[tp][],rt[tp][],,A,y);
while(tp>&&v[tp-].size()==v[tp].size()) {
int t1=,t2=; vector<pr> t;
for(int i=;i<=v[tp-].size();i++) dl(rt[tp-][i],,A);
for(int i=;i<=v[tp].size();i++) dl(rt[tp][i],,A);
while(t1<v[tp-].size()||t2<v[tp].size()) {
if(t1<v[tp-].size()&&(t2==v[tp].size()||v[tp-][t1]<v[tp][t2]))
t.push_back(v[tp-][t1++]),ins2(rt[tp-][t1+t2],rt[tp-][t1+t2-],,A,v[tp-][t1-].second);
else t.push_back(v[tp][t2++]),ins2(rt[tp-][t1+t2],rt[tp-][t1+t2-],,A,v[tp][t2-].second);
}
v[tp-]=t,v[tp].clear(),tp--;
}
}
int qr(int x,int y,int k3) {
int r=;
for(int i=;i<=tp;i++) {
int k=lower_bound(v[i].begin(),v[i].end(),mk(x+k3,0x3f3f3f3f))-v[i].begin();
int k2=lower_bound(v[i].begin(),v[i].end(),mk(x-k3,))-v[i].begin();
r+=qr2(rt[i][k],rt[i][k2],,A,max(,y-k3),min(y+k3,A));
}
return r;
} int main() {
scanf("%d%d",&n,&q),vs[]=;
for(int i=;i<;i++) rb[++tt]=i,vs[i]=;
for(int i=;i<=n;i++) scanf("%d",&a[i]),ins(a[i]+i,a[i]-i+N);
while(q--) {
scanf("%s%d%d",op,&x,&y);
if(op[]=='Q') printf("%d\n",qr(a[x]+x,a[x]-x+N,y));
else a[x]=y,ins(y+x,y-x+N);
}
return ;
}

BZOJ2989 数列(二进制分组)的更多相关文章

  1. [BZOJ 2989]数列(二进制分组+主席树)

    [BZOJ 2989]数列(二进制分组+主席树) 题面 给定一个长度为n的正整数数列a[i]. 定义2个位置的graze值为两者位置差与数值差的和,即graze(x,y)=|x-y|+|a[x]-a[ ...

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

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

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

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

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

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

  5. UOJ46. 【清华集训2014】玄学 [线段树,二进制分组]

    UOJ 思路 模拟赛出了这题,结果我没学过二进制分组--一波主席树然后空间就爆炸了-- 用线段树维护时间序列,每个节点维护\(a_i\to x_i\times a_i+b_i,i\in [1,n]\) ...

  6. 【Codeforces710F】String Set Queries (强制在线)AC自动机 + 二进制分组

    F. String Set Queries time limit per test:3 seconds memory limit per test:768 megabytes input:standa ...

  7. 【BZOJ3821/UOJ46】玄学(二进制分组,线段树)

    [BZOJ3821/UOJ46]玄学(二进制分组,线段树) 题面 BZOJ UOJ 题解 呜,很好的题目啊QwQ. 离线做法大概可以线段树分治,或者直接点记录左右两次操作时的结果,两个除一下就可以直接 ...

  8. CodeForces - 710F:String Set Queries (二进制分组 处理 在线AC自动机)

    ou should process m queries over a set D of strings. Each query is one of three kinds: Add a string ...

  9. HDU 6166 Senior Pan(二进制分组+最短路)

    题意 给出一个\(n\)个点\(m\)条边的有向图\((n,m<=100000)\),从中选择\(k\)个点\((k<=n)\),问这k个点两两之间的最短路最小值是多少? 思路 直接的想法 ...

随机推荐

  1. 《高级软件测试》Linux平台Jira的安装与配置

    现在大部分的程序开发都是在linux下进行的,jira更多的时候是安装在linux上,那么,如何在linux下安装配置jira呢?本文将以Ubuntu 17.10和jira7.5.2为例,对linux ...

  2. SpringMVC源码情操陶冶#task-executor解析器

    承接Spring源码情操陶冶-自定义节点的解析.线程池是jdk的一个很重要的概念,在很多的场景都会应用到,多用于处理多任务的并发处理,此处借由spring整合jdk的cocurrent包的方式来进行深 ...

  3. Java可重入锁如何避免死锁

    本文由https://bbs.csdn.net/topics/390939500和https://zhidao.baidu.com/question/1946051090515119908.html启 ...

  4. 逆向集录_00_不同程序OEP特征总结

    在分析/逆向 程序时,如果事先知道这类程序的一些特征,那将会是事半功倍的: 分析/逆向 程序,和写程序不同,比喻的话:写程序像在作案,分析/逆向 程序就像是在破案,对破案来讲,重在假想和推理: 特征1 ...

  5. thinkphp框架的大D方法应用

    大D方法中需要传递一个模型,比如UserModer,就传递D('User'),而数据库中存在一个表比如think_user,其中think就是前缀. 在UserModel里面存在自动验证.自动完成可以 ...

  6. 新概念英语(1-129)Seventy miles an hour

    Lesson 129 Seventy miles an hour 时速70英里 Listen to the tape then answer this question. What does Ann ...

  7. Nginx负载均衡(架构之路)

    [前言] 在大型网站中,负载均衡是有想当必要的.尤其是在同一时间访问量比较大的大型网站,例如网上商城,新闻等CMS系统,为了减轻单个服务器的处理压力,我们引进了负载均衡这一个概念,将一个服务器的压力分 ...

  8. IDE-Ecplise-代码注释 模版 编码规范 配色

    说明: 代码注释主要用于方便代码后期维护,编码规范,增加代码阅读性和维护性.因网上看到的很多博客中片段局多,故整理后重写一篇,方便交流学习. 先看下加过注释模版后的效果. 如上图所示,创建类,方法和继 ...

  9. 【52ABP实战教程】00-- ASP.NET CORE系列介绍

    为什么是.net core? 记得在半年前.NET CORE刚刚出了1.0,当时有朋友推荐我使用的时候,个人觉得还不成熟. 现在.NET Core已经到了2.0,.NET Standard 2.0 添 ...

  10. HTML-----<a>、<table>、<form>解析

      超链接 anchor 锚 <a href="url">内容</a> Href Hypertext reference 引用 URL(Uniform Re ...