找连续数
Accepts: 401
Submissions: 1911
Time Limit: 2000/1000 MS (Java/Others)
Memory Limit: 32768/32768 K (Java/Others)
Problem Description
小度熊拿到了一个无序的数组,对于这个数组,小度熊想知道是否能找到一个k 的区间,里面的 k 个数字排完序后是连续的。
现在小度熊增加题目难度,他不想知道是否有这样的 k 的区间,而是想知道有几个这样的 k 的区间。
Input
输入包含一组测试数据。
第一行包含两个整数n,m,n代表数组中有多少个数字,m 代表针对于此数组的询问次数,n不会超过10的4次方,m 不会超过1000。第二行包含n个正整数,第 I 个数字代表无序数组的第 I 位上的数字,数字大小不会超过2的31次方。接下来 m 行,每行一个正整数 k,含义详见题目描述,k 的大小不会超过1000。
Output
第一行输"Case #i:"。(由于只有一组样例,只输出”Case #1:”即可)
然后对于每个询问的 k,输出一行包含一个整数,代表数组中满足条件的 k 的大小的区间的数量。
Sample Input
6 2 3 2 1 4 3 5 3 4
Sample Output
Case #1: 2 2
思路:先打表,打出k由1-n的所以情况,然后o(1)输出就行
打表:只有当区间的[i,j]的max - min == j - i的时候才能是连续严格递增的,并且还不能有重复的,判重可以由简单的hash解决,所以还是很好想的。时间复杂度是O(n^2)
#include <iostream> #include <algorithm> #include <cstdio> #include <cstring> using namespace std; const int INF = 9999990; int a[100001],dp[100001]; int mark[10000]; int ans[10000]; int k; int main() { #ifdef xxz freopen("in.txt","r",stdin); #endif // xxz int n,m; cin>>n>>m; for(int i = 0; i < n; i++) cin>>a[i]; for(int i = 0; i < n; i++){ memset(mark,0,sizeof(int)*n); mark[a[i]] = 1; ans[1]++; int Max = a[i], Min = a[i]; for(int j = i+1; j < n; j++){ if(mark[a[j]]++) break; Max = max(Max,a[j]); Min = min(Min,a[j]); if(Max - Min == j - i) ans[j-i+1]++; } } cout<<"Case #1:"<<endl; for(int i = 1; i <= m; i++){ cin>>k; cout<<ans[k]<<endl; } return 0; }
时间: 2024-10-13 23:19:23