GDUT新生赛—E

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


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值