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. 乐在其中设计模式(C#) - 组合模式(Composite Pattern)

    原文:乐在其中设计模式(C#) - 组合模式(Composite Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 组合模式(Composite Pattern) 作者:weba ...

  2. Java 对象的生命周期

    Java对象的生命周期 在Java中,对象的生命周期包含下面几个阶段: 1.      创建阶段(Created) 2.      应用阶段(In Use) 3.      不可见阶段(Invisib ...

  3. Uncaught TypeError: Cannot read property &#39;call&#39; of undefined jquery.validate.min.js:28

    最近在做表单验证时,,自己写的addMethod 方法总是不起作用.折腾了将近一天. 报告的错误,如下面的 Uncaught TypeError: Cannot read property 'call ...

  4. [Apache Spark源代码阅读]天堂之门——SparkContext解析

    略微了解Spark源代码的人应该都知道SparkContext,作为整个Project的程序入口,其重要性不言而喻,很多大牛也在源代码分析的文章中对其做了非常多相关的深入分析和解读.这里,结合自己前段 ...

  5. cocos2d-x box2d Demo注解

    勤奋努力,持之以恒. 核心概念 Box2D 中有一些主要的对象,这里我们先做一个简要的定义,在随后的文档里会有更具体的描写叙述. 刚体(rigid body) 一块十分坚硬的物质,它上面的不论什么两点 ...

  6. java使用Base64编码和解码的图像文件

    1.编码和解码下面的代码示例看: import java.awt.image.BufferedImage; import java.io.ByteArrayOutputStream; import j ...

  7. Matlab Newton‘s method

    定义函数 function y=f(x) y=f(x).%函数f(x)的表达式 end function z=h(x) z=h(x).%函数h(x)的表达式 end 主程序 x=X;%迭代初值 i=0 ...

  8. CGI原理解析系列之中的一个----CGI怎样获取WEBserver数据

    //gcc get_post.c -o get_post.ums; #include <stdio.h> #include <stdlib.h> #include <un ...

  9. 简单工厂模式—>工厂模式

    一.功能 根据前一篇博客:策略模式+单例模式+简单工厂模式:推送服务,想试用一下工厂模式:将之前的简单工厂模式格式化为工厂模式. 二.实现 修改前:简单工厂 public static class P ...

  10. TCP/IP、Http、Socket的差别

    网络由下往上分为 物理层.数据链路层.网络层.传输层.会话层.表示层和应用层. 通过初步的了解,我知道IP协议相应于网络层,TCP协议相应于传输层,而HTTP协议相应于应用层, 三者从本质上来说没有可 ...