hdu4638

题意

给定一个序列,序列由1-N个元素全排列而成,求任意区间可组成的连续的段数,比如[1,2,4]两段{[1,2],[4]},[1,2,4,3]一段{[1,2,3,4]}。

对于查询的区间询问的是可组成的连续的数的段数最小值。

分析

分块排好序,O(1)的维护就是每新添加一个元素 t 查看 t-1 与 t+1 是否都在区间内,如是则段数-1,如果都不在,则段数+1。

code

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int MAXN = 1e5 + 10;
int a[MAXN];
int vis[MAXN];
int ans[MAXN];
struct node
{
int l, r, bid, id;
bool operator < (const node &other) const
{
if(bid == other.bid) return r < other.r;
return bid < other.bid;
}
}q[MAXN]; int L, R, res; void query(int l, int r, int is)
{
if(is)
{
for(int i = l; i < L; i++)
{
if(vis[a[i] - 1] && vis[a[i] + 1]) res--;
else if(!vis[a[i] - 1] && !vis[a[i] + 1]) res++;
vis[a[i]] = 1;
}
for(int i = R + 1; i <= r; i++)
{
if(vis[a[i] - 1] && vis[a[i] + 1]) res--;
else if(!vis[a[i] - 1] && !vis[a[i] + 1]) res++;
vis[a[i]] = 1;
}
for(int i = L; i < l; i++)
{
if(vis[a[i] - 1] && vis[a[i] + 1]) res++;
else if(!vis[a[i] - 1] && !vis[a[i] + 1]) res--;
vis[a[i]] = 0;
}
for(int i = r + 1; i <= R; i++)
{
if(vis[a[i] - 1] && vis[a[i] + 1]) res++;
else if(!vis[a[i] - 1] && !vis[a[i] + 1]) res--;
vis[a[i]] = 0;
}
}
else
{
for(int i = l; i <= r; i++)
{
if(vis[a[i] - 1] && vis[a[i] + 1]) res--;
else if(!vis[a[i] - 1] && !vis[a[i] + 1]) res++;
vis[a[i]] = 1;
}
}
L = l; R = r;
ans[q[is].id] = res;
} int main()
{
int T;
scanf("%d", &T);
while(T--)
{
int n, m;
memset(vis, 0, sizeof vis);
res = 0;
scanf("%d%d", &n, &m);
int bsize = sqrt(n);
for(int i = 1; i <= n; i++) scanf("%d", &a[i]);
for(int i = 0; i < m; i++)
{
scanf("%d%d", &q[i].l, &q[i].r);
q[i].id = i;
q[i].bid = q[i].l / bsize;
}
sort(q, q + m);
for(int i = 0; i < m; i++) query(q[i].l, q[i].r, i);
for(int i = 0; i < m; i++) printf("%d\n", ans[i]);
}
return 0;
}

hdu4638的更多相关文章

  1. hdu4638 group 树状数组

    连接:http://acm.hdu.edu.cn/showproblem.php?pid=4638 题意:就给给你n个数(大小在1-n里),然后给你连续的可以构成一个块,再给你N个询问,每个询问一个l ...

  2. HDU-4638 Group 树状数组+离线

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4638 个人认为比较不错的题目. 题意:给一个1-n的排列,询问区间[l,r]的数排序后连续区间的个数. ...

  3. hdu4638 莫队算法

    莫队算法基础题,题目看懂就能做出来 #include<iostream> #include<cstring> #include<cstdio> #include&l ...

  4. HDU4638:Group(线段树离线处理)

    Problem Description There are n men ,every man has an ID(1..n).their ID is unique. Whose ID is i and ...

  5. hdu-4638

    There are n men ,every man has an ID(1..n).their ID is unique. Whose ID is i and i-1 are friends, Wh ...

  6. 2013 Multi-University Training Contest 4

    HDU-4632 Palindrome subsequence 题意:给定一个字符串,长度最长为1000,问该串有多少个回文子串. 分析:设dp[i][j]表示从 i 到 j 有多少个回文子串,则有动 ...

随机推荐

  1. 串口屏与触摸屏人机界面组态软件HMIMaker介绍

    串口屏与触摸屏人机界面组态软件HMIMaker介绍 触摸屏人机界面组态软件HMIMaker,是一款基于ARM架构的嵌入式控制系统开发的嵌入式软件,专业应用于触摸屏的二级界面开发,具有单片机协议,mod ...

  2. Java数据类型及运算

    (一),Java基本类型及运算 注释:可以用于生成API: 命令如:javadoc -d apidoc windowtitle hhh -doctitle aaa  -header bbbb -ver ...

  3. React Starter Kit 中文文档

    最近没事又翻译了个玩意. Github上的一个Star 非常高的 React 样板程序. 由Node.js,Express,GraphQL和React构建,可选加入Redux等,并可以包含Webpac ...

  4. xmlplus 组件设计系列之三 - 文本框

    文本框是页面中最常用的输入组件,它的默认使用方式如下: <input type='text'/> 当然,这里的 `type='text' 可以略去不写.大部分情况下,使用默认的文本框作为输 ...

  5. 微软的STRIDE模型

    微软的STRIDE模型: https://msdn.microsoft.com/en-us/library/ee823878(v=cs.20).aspx Spoofing identity. An e ...

  6. Angular杂谈系列2-Angular2升级Angular4指南

    什么什么?Angualr4都发布了,之前不都才Angualr2的么?又要推翻重来,啊? 那当然不是,Angualr4只是一个版本号而已,本质上还是Angular2:以后,谷歌把新版本的Angualr称 ...

  7. 仿淘宝左侧菜单导航栏纯Html + css 写的

    这俩天闲来没事淘宝逛了一圈看到淘宝的左侧导航菜单做的是真心的棒啊,一时兴起,查了点资料抓了几个图片仿淘宝写了个css,时间紧写的不太好,大神勿喷,给小白做个参考 废话不多说先来个效果图 接下来直接上代 ...

  8. 让Dev C++支持C++11

    打开编译选项

  9. 蓝桥杯-骰子游戏-java

    /* (程序头部注释开始) * 程序的版权和版本声明部分 * Copyright (c) 2016, 广州科技贸易职业学院信息工程系学生 * All rights reserved. * 文件名称: ...

  10. 蓝桥杯-大衍数列-java

    /* (程序头部注释开始) * 程序的版权和版本声明部分 * Copyright (c) 2016, 广州科技贸易职业学院信息工程系学生 * All rights reserved. * 文件名称: ...