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;
}

最新文章

  1. CodeForces 698C LRU
  2. lockfree
  3. mysql innoDB 挂了的临时解决方案
  4. Unity3D实现赛车的灯光效果
  5. Hibernate O/R Mapping模拟
  6. 不同VLAN之间互相通信
  7. cocos2d-iphone加入芒果广告
  8. Redis Admin UI
  9. C++ strcpy实现
  10. vmware能够ping通内网,上不了外网的解决方法
  11. Code Forces 448C Painting Fence 贪婪的递归
  12. python-实现一个贴吧图片爬虫
  13. logistic 回归
  14. 《剑指offer》把数组排成最小的数
  15. SQLSERVER 聚集一个表的字段2008及以后,要求支持XML
  16. [MicroPython]TPYBoardv102播放音乐实例
  17. ReportMachine OCX 的使用方法
  18. Backbone.js源码浅介
  19. MongoDB 连接池
  20. ios 工作日志

热门文章

  1. Python自学笔记——matplotlib极坐标.md
  2. 前端魔法堂:解秘FOUC
  3. NodeJs之fs的读写删移监
  4. 实现图片的循环滚动——JS的简单应用
  5. Failed to read artifact descriptor for xxx:jar 的Maven项目jar包依赖配置的问题解决
  6. Oracle12c多租户管理用户、角色、权限
  7. [.NET] 《Effective C#》快速笔记 - C# 高效编程要点补充
  8. dubbo 入门
  9. 从C++ int类型的变量范围谈起
  10. JAVA的节点流和处理流