hdu-4638-Group(树状数组)
题意
找到区间里有多少组连续数字串
分析:
(转)思路:显然,我们要使得value最大,就要尽量将连续的ID分在一组,所以问题转化为求一个区间中连续ID区间的个数。我们从左往右扫描,依次考虑右端点为i的询问,设dp[l]为区间[l,i]的连续区间个数,po[i]为i出现的位置,若还未出现,则为0,设我们当前考虑的右端点为a[i],首先我们假设a[i]不能和区间[1,i-1]中的任何一个数分到一组,则我们要将dp[1]到dp[i-1]全部加1,然后考虑po[a[i]+1]是否不为0,若不为0则说明a[i]-1已经在前面出现,则我们需要将dp[1]到dp[po[a[i]+1]]全部减一个1,因为a[i]可以和a[i]+1分为一组,则我们之前加的1是多余的。对于a[i]-1的情况同理。以上操作可以由线段树或者树状数组什么的实现,然后再将询问按照右端点从小到大排序,离线处理即可,以下是代码实现
// File Name: 1007.cpp
// Author: Zlbing
// Created Time: 2013年08月02日 星期五 07时44分46秒 #include<iostream>
#include<string>
#include<algorithm>
#include<cstdlib>
#include<cstdio>
#include<set>
#include<map>
#include<vector>
#include<cstring>
#include<stack>
#include<cmath>
#include<queue>
using namespace std;
#define CL(x,v); memset(x,v,sizeof(x));
#define INF 0x3f3f3f3f
#define LL long long
#define REP(i,r,n) for(int i=r;i<=n;i++)
#define RREP(i,n,r) for(int i=n;i>=r;i--)
const int MAXN=1e5+;
int tree[MAXN];
int n;
int lowbit(int x)
{
return x&(-x);
} void add(int pos,int val)////如果要把a[i]增加v,可以通过调用如下函数实现
{
while(pos <=n)
{
tree[pos] += val;
pos += lowbit(pos);//pos+lowbit(x)可以理解变成了x的父亲
}
} int read(int x)//前x项和
{
int s=;
while(x>)
{
s += tree[x];
x -= lowbit(x);//x-lowbit(x)可以理解成变成了x的兄弟
}
return s;
}
int A[MAXN],pos[MAXN];
struct node{
int l,r,index;
bool operator <(const node& rsh)const{
if(r==rsh.r)
return l<rsh.l;
else return r<rsh.r;
}
};
vector<node> Q;
int ans[MAXN];
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int m;
scanf("%d%d",&n,&m);
REP(i,,n){
scanf("%d",&A[i]);
pos[A[i]]=i;
}
Q.clear();
node tmp;
REP(i,,m)
{
scanf("%d%d",&tmp.l,&tmp.r);
tmp.index=i;
Q.push_back(tmp);
}
sort(Q.begin(),Q.end());
CL(tree,);
int j=;
for(int i=;i<=n;i++)
{
add(i,);
if(A[i]+<=n&&pos[A[i]+]<i)
{
add(pos[A[i]+],-);
}
if(A[i]->=&&pos[A[i]-]<i)
{
add(pos[A[i]-],-);
}
while(Q[j].r==i)
{
ans[Q[j].index]=read(Q[j].r)-read(Q[j].l-);
j++;
}
}
REP(i,,m)
{
printf("%d\n",ans[i]);
}
}
return ;
}
hdu-4638-Group(树状数组)的更多相关文章
- HDU 4638 Group 树状数组 + 思路
实际上就是问这个区间编号连续的段的个数,假如一个编号连续的段有(a+b)个人,我把他们分在同一组能得到的分值为(a+b)^2,而把他们分成人数为a和b的两组的话,得到的分值就是a^2+b^2,显然(a ...
- HDU 4638 Group ★(树状数组)
题意 询问一段区间里的数能组成多少段连续的数. 思路 先考虑从左往右一个数一个数添加,考虑当前添加了i - 1个数的答案是x,那么可以看出添加完i个数后的答案是根据a[i]-1和a[i]+1是否已经添 ...
- 区间的关系的计数 HDU 4638 离线+树状数组
题目大意:给你n个人,每个人都有一个id,有m个询问,每次询问一个区间[l,r],问该区间内部有多少的id是连续的(单独的也算是一个) 思路:做了那么多离线+树状数组的题目,感觉这种东西就是一个模板了 ...
- hdu4638 group 树状数组
连接:http://acm.hdu.edu.cn/showproblem.php?pid=4638 题意:就给给你n个数(大小在1-n里),然后给你连续的可以构成一个块,再给你N个询问,每个询问一个l ...
- POJ2985 The k-th Largest Group[树状数组求第k大值+并查集||treap+并查集]
The k-th Largest Group Time Limit: 2000MS Memory Limit: 131072K Total Submissions: 8807 Accepted ...
- HDU 2838 (DP+树状数组维护带权排序)
Reference: http://blog.csdn.net/me4546/article/details/6333225 题目链接: http://acm.hdu.edu.cn/showprobl ...
- HDU 2689Sort it 树状数组 逆序对
Sort it Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Sub ...
- poj 2985 The k-th Largest Group 树状数组求第K大
The k-th Largest Group Time Limit: 2000MS Memory Limit: 131072K Total Submissions: 8353 Accepted ...
- hdu 4046 Panda 树状数组
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4046 When I wrote down this letter, you may have been ...
- hdu 5497 Inversion 树状数组 逆序对,单点修改
Inversion Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=5497 ...
随机推荐
- 咱也玩玩Wordpress
博客暂时转移到了 -> www.zhyfzy.ga 域名改成.com啦 -> www.zhyfzy.com
- codevs1380 没有丧尸的舞会
/* 树形DP 而然我并不知道树在哪(....) f[x][0]表示x节点不参加舞会 以x为根的子树的最优解 f[x][1]表示x节点参加舞会 以x为根的子树的最优解 方程为:(so为x的儿子 so要 ...
- selenium+eclipse+python环境
1.下载并安装jdk,配置环境变量: 2.下载并安装python,配置path系统环境变量:D:\Program Files\python34: 3.安装selenium,在安装好的python路径D ...
- Android-自定义多TAB悬浮控件实现蘑菇街首页效果
因为项目的一些需求需要用到此种展现方式. 找了市面上大部分有类似功能的应用. 基本思路嵌套ScrollView 转换事件分发给listview 实现. 但是此种方案有个缺点. 在ScrollVie ...
- SQL中使用的一些函数问题
abs()取绝对值ceil()上取整floor()下取整initcap()使串中的所有单词的首字母变为大写substr()取子串 这些函数都是oracle的sql内置函数.
- iOS GCD多线程介绍
GCD:是纯C语言写的,是苹果公司为多核的并行运算提出的解决方案. GCD的两个核心概念: - 任务 - 队列 将任务添加到队列中 GCD会自动将队列中的任务取出,放到对应的线程中执行 任务的取出遵循 ...
- xml有哪些解析技术?区别是什么?
xml有哪些解析技术?区别是什么? Answer: 有DOM,SAX,STAX等 (1):DOM:处理大型文件时其性能下降的非常厉害.这个问题是由DOM的树结构所造成的,这种结构占用的内存较多,而且D ...
- Linux命令:tail命令详解
概述:tail命令显示文件末尾区块,也可以查看线上日志 1.格式 tail [参数][文件] 2.参数 -f 循环读取 -q 不显示处理信息 -v 显示详细的处理信息 -c<数目> 显示的 ...
- 2016年9月ccf
去长沙理工考ccf.恰好又可以见闺蜜. 前2道题很简单,第三题题目太长就跳过了[绕来绕去就像“你儿子是我儿子的爸爸一样头疼”],就做第四题.但是还有最后一个部分没写写好就到点了. 现在把它补充完整. ...
- cocos2dx ease 公式
所有ease计算公式都在CCTweenFunction.cpp里.