题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4638

题意:给出一个数列,若干询问。每次询问区间[L,R]的最少有多少段?每一段是连续的一段且这段内的数字也是连续的。

思路:对于新加入一个数字x,若之前x-1和x+1都已经加入了,那么总段数减1,若都没有加入,则总段数加1,若只加入一个,则总段数不变。然后,我们将数列分成 sqrt(n)段,将询问按照左端点放到相应的段中。同一段中按照右端点升序排序。那么在同一段中,右侧最多移动长度n左侧最左移动sqrt(n)。

struct node
{
    int L,R,id;
    
    void get()
    {
        RD(L,R);
        L--; R--;
    }
    
    int operator<(const node &a) const
    {
        return R<a.R;
    }
};

node a[N];
int n,m,d[N],ans[N],h[N];

vector<node> V[505];

int main()
{
    rush()
    {
        RD(n,m);
        int i,len=sqrt(n+1.0),cnt=(n+len-1)/len;
        FOR0(i,cnt) V[i].clear();
        FOR0(i,n) RD(d[i]);
        FOR1(i,m) 
        {
            a[i].get(),a[i].id=i;
            V[a[i].L/len].pb(a[i]);
        }
        FOR0(i,cnt) sort(V[i].begin(),V[i].end());
        
        int x,j,k=1,t,l,r;
        FOR0(i,cnt)
        {
            l=i*len; r=l-1; x=0; clr(h,0);
            FOR0(j,SZ(V[i]))
            {
                while(r<V[i][j].R)
                {
                    t=d[++r];
                    if(h[t-1]&&h[t+1]) x--;
                    else if(!h[t-1]&&!h[t+1]) x++;
                    h[t]=1;
                }
                while(l>V[i][j].L) 
                {
                    t=d[--l];
                    if(h[t-1]&&h[t+1]) x--;
                    else if(!h[t-1]&&!h[t+1]) x++;
                    h[t]=1;
                }
                while(l<V[i][j].L)
                {
                    t=d[l++];
                    if(h[t-1]&&h[t+1]) x++;
                    else if(!h[t-1]&&!h[t+1]) x--;
                    h[t]=0;
                }

ans[V[i][j].id]=x;
            }
        }
        FOR1(i,m) PR(ans[i]);
    }
}

HDU 4638 Group(分组)的更多相关文章

  1. hdu 4638 Group

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

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

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

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

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

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

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

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

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

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

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

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

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

  8. hdu 4638 Group 莫队算法

    题目链接 很裸的莫队, 就不多说了... #include<bits/stdc++.h> using namespace std; #define pb(x) push_back(x) # ...

  9. HDU 4638 Group(莫队)题解

    题意:n个数,每个数有一个值,每次询问一个区间,问你这个区间能分成连续的几段(比如7 1 2 8 就是两端 1 2 和 7 8) 思路:莫队.因为L.R移动顺序wa了20发...问了一下别人,都是先扩 ...

随机推荐

  1. NYOJ-85 有趣的数 AC 分类: NYOJ 2014-01-17 21:42 240人阅读 评论(0) 收藏

    这道题目就是,找规律,小学奥数,找规律不难吧, #include<stdio.h> int sc(int x); int main(){ int n=0; int num,cs,k; sc ...

  2. 【bzoj1003】[ZJOI2006]物流运输

    1003: [ZJOI2006]物流运输 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 6331  Solved: 2610[Submit][Stat ...

  3. Linux 的多线程编程的高效开发经验

    http://www.ibm.com/developerworks/cn/linux/l-cn-mthreadps/ 背景 Linux 平台上的多线程程序开发相对应其他平台(比如 Windows)的多 ...

  4. 新浪微博之XSS蠕虫脚本源码讲解

    主要是因为新浪的广场页面有几个链接对输入参数过滤不严导致的反射性XSS.======================================== 微博XSS漏洞点 weibo.com/pub/ ...

  5. 如何在Asp.net中备份Access数据库?

    public   void   Create(   string   mdbPath   ) { if(   File.Exists(mdbPath)   )   //检查数据库是否已存在 { thr ...

  6. 火狐和IE之间的7个JavaScript差异

    尽管 JavaScript 历史上使用冗长而令人生厌的代码块来标的特定浏览器的时期已经结束了,但是偶尔使用一些简单的代码块和对象检测来确保一些代码在用户机器上正常工作依然是必要的. 这篇文章中,我会略 ...

  7. mysql存储过程和事件

    1.会员表member和车辆表car,更新每个会员下面的车辆数量have_car字段. DELIMITER $$ USE $$ DROP PROCEDURE IF EXISTS `sp_update_ ...

  8. mysql SQLyog导入导出csv文件

    1.选择数据库表 --> 右击属性 --> 备份/导出 --> 导出表数据作为 --> 选择cvs --> 选择下面的“更改” --> 字段 --> 变量长度 ...

  9. NodeJS模块、包、NPM

    1.NodeJS模块        每一个Nodejs都是一个NodeJS模块,包括JS文件,JSON文本文件,二进制模块文件. a.模块的应用               新建一个文件mytest. ...

  10. linux ps命令详解

    ps工具标识进程的5种状态码: D 不可中断 uninterruptible sleep (usually IO) R 运行 runnable (on run queue) S 中断 sleeping ...