Group

题目:

给出n个数,是1-n的排列。要求你每次给你一个区间求出这个区间能够被分成的小区间个数。

一个不连续的数能够被分成一个小区间。t-1,t或t,t+1表示连续。

算法:

高速做法应该是线段树。可是,我不会。

学了一个块状数组。

#include <iostream>
#include <algorithm>
#include <vector>
#include <cstdio>
#include <cmath>
#include <cstring>
using namespace std; const int MAXN = 100000 + 10; struct Node{
int l,r,id,b; bool operator < (const Node& rhs) const {
if(b != rhs.b){
return b < rhs.b;
}
return r < rhs.r;
}
}query[MAXN]; int seg[MAXN];
bool vst[MAXN];
int n,m,res;
int ans[MAXN]; void cal(int x,int &l,int &r){
int L = query[x].l, R = query[x].r;
while(L < l){ //须要将左右区间进行放大。否则可能出现左右游标交错的情况
--l;
int t = seg[l];
vst[t] = 1;
if(vst[t-1]&&vst[t+1]) --res;
else if(!vst[t-1]&&!vst[t+1]) ++res;
} while(R > r){
++r;
int t = seg[r];
vst[t] = 1;
if(vst[t-1]&&vst[t+1]) --res;
else if(!vst[t-1]&&!vst[t+1]) ++res;
} while(L > l){
int t = seg[l];
vst[t] = 0;
if(vst[t-1]&&vst[t+1]) ++res;
else if(!vst[t-1]&&!vst[t+1]) --res;
++l;
} while(R < r){
int t = seg[r];
vst[t] = 0;
if(vst[t-1]&&vst[t+1]) ++res;
else if(!vst[t-1]&&!vst[t+1]) --res;
--r;
}
} void solve(){
memset(vst,0,sizeof(vst));
sort(query,query + m);
res = 0;
int l = query[0].l, r = query[0].r;
for(int i = l;i <= r;++i){
int t = seg[i];
vst[t] = 1;
if(vst[t-1] && vst[t+1]) --res;
else if(!vst[t-1]&&!vst[t+1]) ++res;
} ans[query[0].id] = res;
for(int i = 1;i < m;++i){
ans[query[i].id] = (cal(i,l,r),res);
} for(int i = 0;i < m;++i){
printf("%d\n",ans[i]);
} } int main()
{
int T;
scanf("%d",&T);
while(T--){
scanf("%d%d",&n,&m); for(int i = 1;i <= n;++i){
scanf("%d",&seg[i]);
} int B = sqrt(1.0*n);
for(int i = 0;i < m;++i){
scanf("%d%d",&query[i].l,&query[i].r);
query[i].b = query[i].l / B;
query[i].id = i;
} solve();
}
return 0;
}

HDU Group的更多相关文章

  1. hdu 4638 Group

    http://acm.hdu.edu.cn/showproblem.php?pid=4638 问题其实就是求[L,R]中有多少个连续的段 若每一个人都是一个段 那么[L,R]中每一个朋友关系就会减少一 ...

  2. HDU 4638 Group(分组)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4638 题意:给出一个数列,若干询问.每次询问区间[L,R]的最少有多少段?每一段是连续的一段且这段内的 ...

  3. HDU 4638 Group 【树状数组,分块乱搞(莫队算法?)】

    根据题目意思,很容易得出,一个区间里面连续的段数即为最少的group数. 题解上面给的是用树状数组维护的. 询问一个区间的时候,可以一个一个的向里面添加,只需要判断a[i]-1 和 a[i]+1是否已 ...

  4. HDU 4638 Group (线段树 | 树状数组 + 离线处理)

    Group Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submi ...

  5. HDU 4638 Group (2013多校4 1007 离线处理+树状数组)

    Group Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submi ...

  6. HDU 5304(Eastest Magical Day Seep Group&#39;s Summer-环加外向树生成树计数)[Template:Kirchhoff矩阵]

    Eastest Magical Day Seep Group's Summer Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 655 ...

  7. hdu 4638 Group(离线+树状数组)

    Group Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Subm ...

  8. HDU 4638 Group 树状数组 + 思路

    实际上就是问这个区间编号连续的段的个数,假如一个编号连续的段有(a+b)个人,我把他们分在同一组能得到的分值为(a+b)^2,而把他们分成人数为a和b的两组的话,得到的分值就是a^2+b^2,显然(a ...

  9. HDU 4638 Group ★(树状数组)

    题意 询问一段区间里的数能组成多少段连续的数. 思路 先考虑从左往右一个数一个数添加,考虑当前添加了i - 1个数的答案是x,那么可以看出添加完i个数后的答案是根据a[i]-1和a[i]+1是否已经添 ...

随机推荐

  1. STM32本学习笔记EXTI(外部中断)

    参考资料:STM32数据表.网络信息 =========================================切割线===================================== ...

  2. jQuery整理笔记2----jQuery选择整理

    一个.基本的选择 1.ID选择器 JavaScript提供了原生方法实如今DOM中选择指定ID值得元素. 使用方法例如以下: var element=document.getElementById(& ...

  3. 怎样设制 select 不可编辑 仅仅读

    1. <select style="width:195px" name="role"  id="role" onfocus=" ...

  4. 警报C++精密整数除法计算损失

    非常偶然发现了一个精度损失的问题,简单来说: 有表达式: l = i/30 + j/40 + k/25, 求当{i,j,k} = {50,85,27}时l的值,非常easy,用计算器立即能够算出答案为 ...

  5. Java知多少(4)J2SE、J2EE、J2ME的区别

    原文:Java知多少(4)J2SE.J2EE.J2ME的区别 1998年12月,SUN公司发布了Java 1.2,开始使用“Java 2” 这一名称,目前我们已经很少使用1.2之前的版本,所以通常所说 ...

  6. Nancy 框架

    Nancy 框架 Nancy 框架 1.是一个轻量级用于构建http相应的web框架: 2.与mvc类似,有自己的路由机制: 3.可以处理 DELETE ,  GET ,  HEAD ,  OPTIO ...

  7. 左右AjaxFileUpload背景返回Json治

    项目中用到图片的无刷新上传,因此想到用ajaxUpLoadFile来解决. 第一步,先在上传图片的页面引入你下载到本地的ajaxfileupload.js文件. 文件下载地址:http://downl ...

  8. poj 1274The Perfect Stall

    第一次接触二分图匹配. 这题是一个匈牙利算法的模板题直接套即可. 题意是  给你奶牛和谷仓的个数a和b,接下来a行是奶牛喜欢去的谷仓.第一个是谷仓个数,接下来是谷仓编号. 这里我们把行当奶牛,列当谷仓 ...

  9. Oracle与Sql Server复制表结构和数据

    1.Oracle create table 新表名 AS SELECT * FROM 源表名 2.Sql Server SELECT * into 新表名 from 源表名 版权声明:笔者:jiank ...

  10. C#采用的是“四舍六入五成双”、上取整、下取整

    c# 四舍五入.上取整.下取整 Posted on 2010-07-28 12:54 碧水寒潭 阅读(57826) 评论(4) 编辑 收藏 在处理一些数据时,我们希望能用“四舍五入”法实现,但是C#采 ...