题意:
连续的数字为一组
如:3,1,2为一组(次序无关)
3 ,1,2,5,6
有两组。3,1,2和5,6
求在一个区间里有这样的组有几组
#include <iostream>
#include <algorithm>
#include <vector>
#include <cmath>
#include <stdio.h>
#include <cstring>
using namespace std;
typedef long long ll;
const int N=100005;
int t[N],b[N],c[N],ans[N],ANS,num[N];
struct node
{
int l,r,id,ans;
}a[N];
int n,q,m,k;
bool cmp(node a,node b)
{
if(a.l/k==b.l/k) return a.r<b.r;
else return a.l<b.l;
}
bool cmp_id(node a,node b)
{
return a.id<b.id;
}
void add(int x)
{
int tmp=t[x];
num[tmp]=1;
if(num[tmp+1]&&num[tmp-1])
--ANS;
else if(num[tmp+1]==0&&num[tmp-1]==0)
++ANS;
}
void del(int x)
{
int tmp=t[x];
num[tmp]=0;
if(num[tmp+1]&&num[tmp-1])
++ANS;
else if(num[tmp+1]==0&&num[tmp-1]==0)
--ANS;
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
memset(num,0,sizeof(num));
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
scanf("%d",&t[i]);
}
k=sqrt(n);
for(int i=0;i<m;i++)
{
scanf("%d%d",&a[i].l,&a[i].r);
a[i].id=i;
}
sort(a,a+m,cmp);
ANS=0;
for(int i=0,l=1,r=0;i<m;i++)
{
if(a[i].l>r||a[i].r<l)
{
while(l<=r) num[t[l++]]=0;
l=a[i].l;
r=a[i].l-1;
ANS=0;
for(;r<a[i].r;r++) add(r+1);
a[i].ans=ANS;
continue;
}
for(;r<a[i].r;r++)
add(r+1);
for(;r>a[i].r;r--)
del(r);
for(;l<a[i].l;l++)
del(l);
for(;l>a[i].l;l--)
add(l-1);
a[i].ans=ANS;
}
sort(a,a+m,cmp_id);
for(int i=0;i<m;i++)
printf("%d\n",a[i].ans);
}
return 0;
}