arc098E Range Minimum Queries

题意:给你一个n个数的数组,每次能够选取连续的长度为K的子序列,取出其中任意一个最小元素。

一共操作Q次。问取出的元素中Max-Min最小是多少?

标程:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int N=2005;
 4 const int inf=0x3f3f3f3f;
 5 int l,top,n,k,Q,a[N],b[N],ans,q[N];
 6 vector<int> vec;
 7 int solve(int x)
 8 {
 9     l=1;vec.clear();
10     for (int i=1;i<=n+1;i++)
11       if (a[i]<x)
12       {
13             if (i-l>=k)
14             {
15                   top=0;
16                   for (int j=l;j<i;j++) q[++top]=a[j];
17                sort(q+1,q+top+1);
18                for (int j=1;j<=i-l-k+1;j++) vec.push_back(q[j]);
19           }
20             l=i+1;
21       }
22     sort(vec.begin(),vec.end());
23     if (Q-1>=vec.size()) return inf;
24     return vec[Q-1]-x;
25 }
26 int main()
27 {
28     scanf("%d%d%d",&n,&k,&Q);
29     for (int i=1;i<=n;i++) scanf("%d",&a[i]),b[i]=a[i];
30     sort(b+1,b+n+1);ans=inf;
31     for (int i=1;i<=n;i++) ans=min(ans,solve(b[i]));
32     printf("%d\n",ans);
33     return 0;
34 }

题解:技巧

枚举取数的最小值x,比x小的数都不能取。分裂数组为小块。

每个小块最多贡献len-k+1个最小值,把所有的len-k+1个最小值取出来排个序。取第Q个即是最小的Max。

我居然想出来了哈!

猜你喜欢

转载自www.cnblogs.com/Scx117/p/9117153.html