hdu4638
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的更多相关文章
- hdu4638 group 树状数组
连接:http://acm.hdu.edu.cn/showproblem.php?pid=4638 题意:就给给你n个数(大小在1-n里),然后给你连续的可以构成一个块,再给你N个询问,每个询问一个l ...
- HDU-4638 Group 树状数组+离线
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4638 个人认为比较不错的题目. 题意:给一个1-n的排列,询问区间[l,r]的数排序后连续区间的个数. ...
- hdu4638 莫队算法
莫队算法基础题,题目看懂就能做出来 #include<iostream> #include<cstring> #include<cstdio> #include&l ...
- HDU4638:Group(线段树离线处理)
Problem Description There are n men ,every man has an ID(1..n).their ID is unique. Whose ID is i and ...
- 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 ...
- 2013 Multi-University Training Contest 4
HDU-4632 Palindrome subsequence 题意:给定一个字符串,长度最长为1000,问该串有多少个回文子串. 分析:设dp[i][j]表示从 i 到 j 有多少个回文子串,则有动 ...
随机推荐
- 【HDOJ 2150】线段交叉问题
Pipe Time Limit : 1000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other) Total Submissi ...
- JavaScript 小函数积累及性能优化
获取值的类型: var toString = Object.prototype.toString; function getType(o) { return toString.call(o).slic ...
- 利用WebLog Experet分析日志获取性能需求
一.下载WebLog Expert日志分析工具 官网下载地址:http://www.weblogexpert.com/download.htm 二.安装 安装很简单,点击“下一步”默认安装即可 三.配 ...
- ubuntu 下安装Angular2-cli脚手架
一.首先需要安装node,npm. 请到nodejs官网进行下载并跟据提示进行安装 版本号中间偶数为稳定版本建议下载 https://nodejs.org/en/ node相关操作 https://n ...
- [编织消息框架][传输协议]stcp简单开发
测试代码 public class ServerSTCP { static int SERVER_PORT = 3456; static int US_STREAM = 0; static int F ...
- 【NIO】Java NIO之选择器
一.前言 前面已经学习了缓冲和通道,接着学习选择器. 二.选择器 2.1 选择器基础 选择器管理一个被注册的通道集合的信息和它们的就绪状态,通道和选择器一起被注册,并且选择器可更新通道的就绪状态,也可 ...
- Vim安装YouCompletMe插件。
1.Centos7.0自带含有支持python2.x的vim.(:version 后看python+则支持,python-则不支持)若不支持,卸载vim后源码编译安装. yum install pyt ...
- Pycharm实用技巧汇总
Pycharm中输入 a = list 按住Command点鼠标左键,即可查看该类下的所有用法,如下图 获取类中有哪些成员
- 前端模块化——seaJS
1.seaJS手记 一:Bower获取 要安装bower Npm install -g bower Bower install seajs 二:Use方法是整个项目的入口方法,通常一个项目中只调用一次 ...
- 单源最短路Dijkstra算法——matlab实现
迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个节点到其他节点的最短路径. 它的主要特点是以起始点为中心向外层层扩展(广度优先搜索思想),直到扩展到终点为止. 基本思想 通过Dijk ...