Problem E: 穷游中国在统题

Description

Travel_poorly队是广工大目前最年轻的金牌队伍,队内成员分别是tmk、YFQ、Maple。这天他们接到教练的order要给新生杯统题,统题是个不轻松的工作,要评估各个题目的难度,设计出一套有梯度的套题,使得做题的情况有区分度。tmk很快想出了解决的办法,他给每道题目都设置了一个难度值,然后按照难度值进行筛选题目,这时候他发现难度值刚开始有可能是无序的,于是他决定要让全部题目都按照难度值从小到大排好序。 这时候YFQ说让他来排序,排序是一个展现算法魅力的过程,他要通过一种有趣的方法来给题目的难度值排序: 首先他把题目划分成很多组,每组的题目都是连续的,例如某一组包含从i到j的题目,那么这一组包含的是第i,i+1,i+2,i+3,...,j题。 这样每道题都属于某一个组,然后他再到组内把题目按照难度值进行从小到大排序。 当每个组内都进行排序之后,最终全部题目的难度值将按照从小到大的顺序排列好。 我们知道每一组里面的题目越多,排序的压力就越大,所以Maple提出一个合理的要求,就是让每个组里面的题目数量尽可能的少,聪明的ACMer,你知道Travel_poorly一共要分出多少个组吗?

Input

第一行是一个整数t ( t<= 10 ),表示有t组数据。在每组数据中: 第一行是一个整数n ( n<=1000 00 ),表示题目的总数; 第二行是n个整数A1,A2,A3...An ( 0<=Ai<= 1000 000 000),表示每道题目的难度值

Output

对于每组数据,输出一个正整数,表示一共要分出多少个组能满足Travel_poorly的要求,每两组样例之间输出一个空行。

Sample Input

2

5

3 2 5 4 6

5

5 4 3 2 1

Sample Output

3

1

【分析】

需要一点点思想的题目...稍微模拟一下就可以发现,某一个数所在的区间,最起码都是它当前的位置到排序后的位置这一个区间

也就是说

比如 3 2 5 4 6

排序之后是 2 3 4 5 6

那么排序后的2所谓的位置到排序前2所在的位置这一个区间是必须被分在一个区间内的。

所以题目就变成了判断原来位置和排序后位置的区间的问题

显然相交的区间需要合并成一个区间

然后计算区间个数即可

这道题有一个问题,就是如果当难度值一样的时候,当然是按照原来的顺序比较好

所以我的程序wa了一次...就是因为忘记考虑快排的不稳定性....


【代码】

#include <stdio.h>
#include <algorithm>
using namespace std;


struct xx{
int x,id;
}a[101000];


bool cmp(xx q,xx w)
{
if (q.id==w.id)
return q.x<w.x;
else
return q.id<w.id;
}


int main()
{
int t=0;
int pp;scanf("%d",&pp);
while (pp--)
{
int n;scanf("%d",&n);
for (int i=0;i<n;i++)
{
a[i].x=i;
scanf("%d",&a[i].id);
}
sort(a,a+n,cmp);
int ans=0;
int xx=0;
while (xx<n)
{
ans++;
int y=a[xx].x;
for (int i=xx;i<=y;i++) if (a[i].x>y) y=a[i].x;
xx=y+1;
}
if (t) printf("\n");
printf("%d\n",ans);
t=1;
}
}