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. hdu 5094 Maze(水搜索)

    题目意思:说有一个人在(1,1) 他的目标点在(n,m) 每次是4方向的移动: 限制条件:有的各自之间有墙 或者门,强不可通过,有对应的要钥匙可以开启这个类型的所有门: 问题:求最少步骤数(和): 类 ...

  2. Java OCR tesseract 图像智能字符识别技术

    公司有需求啊,所以就得研究哈,最近公司需要读验证码,于是就研究起了图像识别,应该就是传说中的(OCR:光学字符识别OCR),下面把今天的收获整理一个给大家做个分享. 本人程序用的tesseract,官 ...

  3. Android更改checkbox的style

    resouce文件夹下,value文件夹下,styles.xml文件中新增样式: <resources> <style name="radioButton"> ...

  4. PHP安装mcrypt.so报错 mcrypt.h not found 的解决的方法

    报错内容:configure: error: mcrypt.h not found. Please reinstall libmcrypt 网上搜索了非常多,包含自带的 yum install lib ...

  5. 同ListView该接口无法通过手势滑动左右切换界面问题解决方法

    同ListView该接口无法通过手势滑动左右切换界面问题解决方法 问题描写叙述: 在做OnGestureListener滑动切换窗体的时候,会遇到这种问题.就是当界面中含有ListView的时候.On ...

  6. 【Android基础】短信的发送

    //Button的点击事件 @Override public void onClick(View v) { // 接受者电话号码 Uri uri = Uri.parse("smsto:123 ...

  7. 自己动手写一个编译器Tiny语言解析器实现

    然后,上一篇文章简介Tiny词法分析,实现语言.本文将介绍Tiny的语法分析器的实现. 1 Tiny语言的语法 下图是Tiny在BNF中的文法. 文法的定义能够看出.INNY语言有以下特点: 1 程序 ...

  8. 小说mvvm

    与多样化和复杂的前,设计模式不再是后端专有名词.从最初的面向对象的,框架制定了到现在为止mvc等一下,今天,它主要是关于Model-View-ViewModel(MVVM). 对于mvc大家可能都会相 ...

  9. Dapper的使用

    轻量型ORM框架Dapper的使用 /// <summary> /// 查询操作 /// </summary> /// <typeparam name="T&q ...

  10. hdu 3076 ssworld VS DDD (概率dp)

    ///题意: /// A,B掷骰子,对于每一次点数大者胜,平为和,A先胜了m次A赢,B先胜了n次B赢. ///p1表示a赢,p2表示b赢,p=1-p1-p2表示平局 ///a赢得概率 比一次p1 两次 ...