hdu 4638 树状数组
思路:将查询区间按右节点的升序排列,然后插入第i个数的时候,若nun[i]+1已经插入,那么就update(pre[num[i]+1],-1);pre[]表示的是该数的位置。同样若
num[i]-1存在就update(pre[num[i]-1],-1);因为他么与num[i]属于一组,故只需一个存在就行。当查询的右边界r等于i时,只需对其左边界求和就行,Sum(qt[j].l)。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#define Maxn 100010
#define lowbit(x) (x&(-x))
using namespace std;
int C[Maxn],pre[Maxn],n,ans[Maxn];
struct QT{
int l,r,i;
int operator <(const QT &temp) const
{
return r<temp.r;
}
}qt[Maxn];
int Sum(int pos)
{
int sum=;
while(pos<=n)//求和与更新反向的树状数组
{
sum+=C[pos];
pos+=lowbit(pos);
}
return sum;
}
void update(int pos,int val)
{
while(pos)
{
C[pos]+=val;
pos-=lowbit(pos);
}
}
int main()
{
int t,m,i,j,num[Maxn];
scanf("%d",&t);
while(t--)
{
memset(C,,sizeof(C));
memset(pre,,sizeof(pre));
scanf("%d%d",&n,&m);
for(i=;i<=n;i++)
scanf("%d",num+i),pre[num[i]]=i;
for(i=;i<=m;i++)
{
scanf("%d%d",&qt[i].l,&qt[i].r);
qt[i].i=i;
}
sort(qt+,qt++m);
j=;
for(i=;i<=n;i++)
{
if(j>m)
break;
if(num[i]<n&&pre[num[i]+]<i)
update(pre[num[i]+],-);
if(num[i]>&&pre[num[i]-]<i)
update(pre[num[i]-],-);
update(i,);
while(qt[j].r==i&&j<=m)
{
ans[qt[j].i]=Sum(qt[j].l);
j++;
}
}
for(i=;i<=m;i++)
printf("%d\n",ans[i]);
}
return ;
}
hdu 4638 树状数组的更多相关文章
- hdu 4638 树状数组 区间内连续区间的个数(尽可能长)
		
Group Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Subm ...
 - HDU 4638 树状数组 想法题
		
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4638 解题思路: 题意为询问一段区间里的数能组成多少段连续的数.先考虑从左往右一个数一个数添加,考虑当 ...
 - hdu 4777 树状数组+合数分解
		
Rabbit Kingdom Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) T ...
 - HDU 2852 (树状数组+无序第K小)
		
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2852 题目大意:操作①:往盒子里放一个数.操作②:从盒子里扔掉一个数.操作③:查询盒子里大于a的第K小 ...
 - HDU 4911 (树状数组+逆序数)
		
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4911 题目大意:最多可以交换K次,就最小逆序对数 解题思路: 逆序数定理,当逆序对数大于0时,若ak ...
 - hdu 5792(树状数组,容斥) World is Exploding
		
hdu 5792 要找的无非就是一个上升的仅有两个的序列和一个下降的仅有两个的序列,按照容斥的思想,肯定就是所有的上升的乘以所有的下降的,然后再减去重复的情况. 先用树状数组求出lx[i](在第 i ...
 - HDU 1934 树状数组 也可以用线段树
		
http://acm.hdu.edu.cn/showproblem.php?pid=1394 或者是我自己挂的专题http://acm.hust.edu.cn/vjudge/contest/view. ...
 - 2018 CCPC网络赛 1010 hdu 6447 ( 树状数组优化dp)
		
链接:http://acm.hdu.edu.cn/showproblem.php?pid=6447 思路:很容易推得dp转移公式:dp[i][j] = max(dp[i][j-1],dp[i-1][j ...
 - 【模板】HDU 1541 树状数组
		
http://acm.hdu.edu.cn/showproblem.php?pid=1541 题意:给你一堆点,每个点右一个level,为其右下方所有点的数量之和,求各个level包含的点数. 题解: ...
 
随机推荐
- Oracle  表数据去重
			
Oracle数据库中重复数据怎么去除?使用数据表的时候经常会出现重复的数据,那么要怎么删除呢?下面我们就来说一说去除Oracle数据库重复数据的问题.今天我们要说的有两种方法. 一.根据rowid来去 ...
 - URAL 2040  Palindromes and Super Abilities 2 (回文自动机)
			
Palindromes and Super Abilities 2 题目链接: http://acm.hust.edu.cn/vjudge/contest/126823#problem/E Descr ...
 - [iOS UI进阶 - 2.1] 彩票Demo v1.1
			
A.需求 1.优化项目设置 2.自定义导航栏标题按钮 3.多版本处理 4.iOS6和iOS7的适配 5.设置按钮背景 6.设置值UIBarButtonItem样式 code source: htt ...
 - POJ 3666 Making the Grade (DP)
			
题意:输入N, 然后输入N个数,求最小的改动这些数使之成非严格递增即可,要是非严格递减,反过来再求一下就可以了. 析:并不会做,知道是DP,但就是不会,菜....d[i][j]表示前 i 个数中,最大 ...
 - Spring Data Solr教程(翻译)
			
大多数应用都必须具有某种搜索功能,问题是搜索功能往往是巨大的资源消耗并且它们由于沉重的数据库加载而拖垮你的应用的性能 这就是为什么转移负载到一个外部的搜索服务器是一个不错的主意,Apache Solr ...
 - js两种创建对象方式
			
js创建方法的两种方式 <%@ page language="java" contentType="text/html; charset=ISO-8859-1&qu ...
 - 使用apt-get autoremove造成的系统无法开机
			
由于误操作(apt-get autoremove xxx)删除了一些lib文件貌似,之后,系统直接重启,然后就无法进入系统,后使用引导盘对系统进行修复,思路如下: 1.挂载已经有的分区,挂载为可读可写 ...
 - [置顶] 文件和目录(二)--unix环境高级编程读书笔记
			
在linux中,文件的相关信息都记录在stat这个结构体中,文件长度是记录在stat的st_size成员中.对于普通文件,其长度可以为0,目录的长度一般为1024的倍数,这与linux文件系统中blo ...
 - 位运算&字节运算
 - SQL创建linkserver
			
建立链接服务器并创建同义词,有一个最大的好处,就是可以跨数据库实例进行操作数据库,可以在一个数据库连接内完成数据操作,方便做事务查询. 在SQL SERVER 2008里,可以按以下的方式建立 ...