感觉比较抽象:举个例子:a[] = {3 1 2 5 4}
树状数组里面:1,1,-1,1,-1
sum(2):就是[1,2]区间能分成多少个连续的段:1和3
sum(3):1 2 3是一段
如果是询问[2,4],那么我们要把位置1上的3删掉,其实删是加的逆过程,因为3加入的时候2和4还在3的后面所以就add(i,1)add(i,1)add(i,1),那么这样我们删掉就是add(i,−1)add(i,-1)add(i,−1)现在段数是增加的我们应该在后面哪里加呢?add(pos[a[i]+1],1),add(pos[a[i]−1],1)add(pos[a[i]+1],1),add(pos[a[i]-1],1)add(pos[a[i]+1],1),add(pos[a[i]−1],1),因为对于pos[a[i]-1]之前的位置来说你是删了a[i]是最后一个数段数不会增加所以+1去抵消-1,对于a[i]+1来说你删了前面的一个数它自己独立出来了,对于a[i]+1来说,因为a[i]在a[i]+1前面之前那么a[i]+1 的贡献是0,现在a[i]删了,那么它的贡献就变成1了

删完3之后树状数组:
0,1,0,1,0
同理其他位置也可以推出来


#include <iostream>
#include <cstdio>
#include <stack>
#include <sstream>
#include <vector>
#include <map>
#include <cstring>
#include <deque>
#include <cmath>
#include <iomanip>
#include <queue>
#include <algorithm>
#include <set>
#define mid ((l + r) >> 1)
#define Lson rt << 1, l , mid
#define Rson rt << 1|1, mid + 1, r
#define ms(a,al) memset(a,al,sizeof(a))
#define log2(a) log(a)/log(2)
#define _for(i,a,b) for( int i = (a); i < (b); ++i)
#define _rep(i,a,b) for( int i = (a); i <= (b); ++i)
#define for_(i,a,b) for( int i = (a); i >= (b); -- i)
#define rep_(i,a,b) for( int i = (a); i > (b); -- i)
#define lowbit(x) ((-x) & x)
#define IOS std::ios::sync_with_stdio(0); cin.tie(0); cout.tie(0)
#define INF 0x3f3f3f3f
#define hash Hash
#define next Next
#define count Count
#define pb push_back
#define f first
#define s second
using namespace std;
const int M = 1e5+10, mod = 1e9 + 7;
const double eps = 1e-10;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> PII;
template<typename T> void read(T &x)
{x = 0;char ch = getchar();ll f = 1;while(!isdigit(ch)){if(ch == '-')f*=-1;ch=getchar();}while(isdigit(ch)){x = x*10+ch-48;ch=getchar();}x*=f;
}
template<typename T, typename... Args> void read(T &first, Args& ... args)
{read(first);read(args...);
}int T;
int n, m;
int pos[M], ans[M];
int tr[M], a[M];inline void add(int x, int val)
{while(x <= n){tr[x] += val;x += lowbit(x);}    return;
}inline int sum(int x)
{int res = 0;while(x){res += tr[x];x -= lowbit(x);}return res;
}struct node
{int l, r, id;bool operator < (const node & w) {return l < w.l; }
}e[M];int main()
{read(T);while(T --){memset(tr,0,sizeof(tr));read(n,m);for(int i = 1; i <= n; ++ i) read(a[i]), pos[a[i]] = i;int l, r;for(int i = 0; i < m; ++ i){read(l,r);e[i] = {l,r,i};}sort(e,e+m);pos[0] = n + 1, pos[n + 1] = n + 1;for(int i = 1; i <= n; ++ i){if(i > pos[a[i] - 1] && i > pos[a[i] + 1]) add(i,-1);else if(i < pos[a[i] - 1] && i < pos[a[i] + 1]) add(i,1);}int j = 0, i = 1;while(j < m){while(i <= n && i < e[j].l){ if(i < pos[a[i] - 1] && i < pos[a[i] + 1]){add(i,-1);add(pos[a[i] - 1],1);add(pos[a[i] + 1],1);}else if(i > pos[a[i] - 1] && i > pos[a[i] + 1]) add(i,-1);else if(i < pos[a[i] - 1]){add(i,-1);add(pos[a[i] - 1],1);}else {add(i,-1);add(pos[a[i] + 1],1);}i ++;}while(e[j].l == i && j < m)ans[e[j].id] = sum(e[j].r), j ++;}for(int i = 0; i < m; ++ i)cout << ans[i] << endl;}return 0;
}

C - Group HDU - 4638[离线+树状数组]相关推荐

  1. hdu 4605 Magic Ball Game (在线主席树/离线树状数组)

    版权声明:本文为博主原创文章,未经博主允许不得转载. hdu 4605 题意: 有一颗树,根节点为1,每一个节点要么有两个子节点,要么没有,每个节点都有一个权值wi .然后,有一个球,附带值x . 球 ...

  2. HDU3333 Turing Tree 离线树状数组

    题意:统计一段区间内不同的数的和 分析:排序查询区间,离线树状数组 #include <cstdio> #include <cmath> #include <cstrin ...

  3. 牛客小白9 换个角度思考(离线+树状数组)

    title: 牛客小白9 换个角度思考(离线+树状数组) date: 2018-11-29 15:25:18 tags: [离线,树状数组] categories: ACM 题目链接 题目描述 给定一 ...

  4. 数据结构一【树状数组】普通、二维、离线树状数组的(单点修改,单点查询,区间修改,区间查询)模板及应用例题总结

    文章目录 树状数组 lowbit 线段树与树状数组 单点修改 区间查询 区间修改 区间求和 二维树状数组 离线树状数组 例题 POJ:stars MooFest [SDOI2009]HH的项链 Tur ...

  5. 【BZOJ3653】谈笑风生 离线+树状数组+DFS序

    [BZOJ3653]谈笑风生 Description 设T 为一棵有根树,我们做如下的定义: ? 设a和b为T 中的两个不同节点.如果a是b的祖先,那么称"a比b不知道高明到哪里去了&quo ...

  6. bzoj2754:[SCOI2012]喵星球上的点名 (后缀数组+离线+树状数组)

    题目传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=2754 题目分析:最近两个星期都在做数论题,感觉有些无聊.昨天忽然间想起省赛前还有一个这题 ...

  7. [HEOI2012]采花(思维 + 离线 + 树状数组)

    题目链接 分析 我只能说太妙了- 离线 + 树状数组 参考题解: 这个题要和<HH的项链>做对比: 关键就是为什么要离线处理,以及 怎么对区间进行排序和维护: [SDOI2009]HH的项 ...

  8. 2016 UESTC Training for Data Structures K - 郭大侠与甲铁城 CDOJ 1342 离线树状数组

    K - 郭大侠与甲铁城 有一个区间,长度1e5,每个点有一种颜色,颜色属于[1,1000],离线询问某个区间的颜色种树,询问次数也少1e5 我的做法是离线树状数组 首先把区间保存下来,按右端点升序排序 ...

  9. HDU4417 Super Mario(离线树状数组或者主席树+二分)

    Super Mario Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Tota ...

最新文章

  1. C#“.NET研究”类类型
  2. matlab中如何求零极点,Matlab中绘制零极点
  3. (0094)iOS开发之本地文件预览的三种方法(2)
  4. git中的删除命令操作
  5. how is my appointment opened in HCP
  6. e5cc温控仪通讯参数设定_自动化工程师:施耐德 PLC常见两种编程通讯控制实例,收好不谢...
  7. explicitWidth与width,和用setActualSize()方法有什么区别?
  8. 越来越像QQ?微信支持批量删好友啦!安卓用户“不配”
  9. java简化代码的jar_JAVA奇技淫巧简化代码之lombok
  10. 2016 年:勒索病毒造成损失预估超过 10 亿美元
  11. python视频教程-Python视频教程
  12. 论Web控件开发 - 完美上传下载控件“新”(一)
  13. python读取字符串按列分配后按行读出
  14. 易筋经:现代化支付系统脉络梳理
  15. MacOS Catalina 10.15安装教程,启动U盘制作及安装方法
  16. Weighted Interval Scheduling
  17. 【雷达通信】滤波及数据融合【滤波包括了常增益滤波、卡尔曼(Kalman)滤波和扩展卡尔曼滤波(EKF) 数据融合采用BC和CC两种,基于KF和EKF实现】(Matlab代码实现)
  18. oracle+utl_file+shanchu,utl_file.fremove
  19. 提问的智慧!高手如何成长为高手,高手原来也是像我一样的菜鸟!
  20. Nginx实战学习之负载均衡

热门文章

  1. 蓝牙的自适应跳频技术
  2. not syncing : corrupted stack end detected inside scheduler解决办法 以及高版本的激活码!
  3. ACMNO.35 C语言-宏润年 给年份year,定义一个宏,以判别该年份是否闰年。提示:宏名可以定义为LEAP_YEAR,形参为y,既定义宏的形式为 #define LEAP_YEAR(y)
  4. C++字符串数组排序技巧
  5. EP936E的IIC
  6. 结对编程-马尔科夫链作业成绩
  7. 《3D数学基础》1.8 混合积
  8. if(window.event) e = window.event
  9. MYSQL人事工资管理系统-插入数据(三)
  10. 巧用宏定义进行调试 (转)