题意:就是有一个序列a,a的长度为n,a[i]>=1&&a[i]<=n,然后有s1,s2......sn;s1[1]=1,s2[1]=2.....;这些si的首元素都为i;需要满足降序且从相邻两元素在a中位置只差的绝对值不大于k,找满足这个的字典序最大的序列,然后输出s1,s2,s3...每个非零元素的个数
题解:就是首先求出距离这个元素在k之内的最大值是什么;
然后就从小到大求直接调用num就行。具体看代码
You're given a permutation aa of length nn (1 \le n \le 10^51≤n≤105).
For each i \in [1,n]i∈[1,n], construct a sequence s_isi by the following rules:
- s_i[1]=isi[1]=i;
- The length of s_isi is nn, and for each j \in [2, n]j∈[2,n], s_i[j] \le s_i[j-1]si[j]≤si[j−1];
- First, we must choose all the possible elements of s_isi from permutation aa. If the index of s_i[j]si[j] in permutation aa is pos[j]pos[j], for each j \ge 2j≥2, |pos[j]-pos[j-1]|\le k∣pos[j]−pos[j−1]∣≤k (1 \le k \le 10^51≤k≤105). And for each s_isi, every element of s_isi must occur in aa at most once.
- After we choose all possible elements for s_isi, if the length of s_isi is smaller than nn, the value of every undetermined element of s_isi is 00;
- For each s_isi, we must make its weight high enough.
Consider two sequences C = [c_1, c_2, ... c_n]C=[c1,c2,...cn] and D=[d_1, d_2, ..., d_n]D=[d1,d2,...,dn], we say the weight of CC is higher thanthat of DD if and only if there exists an integer kk such that 1 \le k \le n1≤k≤n, c_i=d_ici=di for all 1 \le i < k1≤i<k, and c_k > d_kck>dk.
If for each i \in [1,n]i∈[1,n], c_i=d_ici=di, the weight of CC is equal to the weight of DD.
For each i \in [1,n]i∈[1,n], print the number of non-zero elements of s_isi separated by a space.
It's guaranteed that there is only one possible answer.
Input
There are multiple test cases.
The first line contains one integer T(1 \le T \le 20)T(1≤T≤20), denoting the number of test cases.
Each test case contains two lines, the first line contains two integers nn and kk (1 \le n,k \le 10^51≤n,k≤105), the second line contains nn distinct integers a_1, a_2, ..., a_na1,a2,...,an (1 \le a_i \le n1≤ai≤n) separated by a space, which is the permutation aa.
Output
For each test case, print one line consists of nn integers |s_1|, |s_2|, ..., |s_n|∣s1∣,∣s2∣,...,∣sn∣ separated by a space.
|s_i|∣si∣ is the number of non-zero elements of sequence s_isi.
There is no space at the end of the line.
样例输入复制
2 3 1 3 2 1 7 2 3 1 4 6 2 5 7
样例输出复制
1 2 3 1 1 2 3 2 3 3
编辑代码
#include<stdio.h>
#include<algorithm>
#include<string.h>
using namespace std;
int a[100100];
int m[100100];
int num[100100];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n,k;
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++)
{
int x;
scanf("%d",&x);
a[x]=i;
}
memset(m,0,sizeof(m));
memset(num,0,sizeof(num));
for(int i=2;i<=n;i++)
{
for(int j=i-1;j>=1;j--)
{
if(abs(a[i]-a[j])<=k)
{
m[i]=j;
break;
}
}
}
num[1]=1;
for(int i=2;i<=n;i++)
{
if(m[i]!=0)
{
num[i]+=num[m[i]];
}
num[i]++;
}
printf("1");
for(int i=2;i<=n;i++)
{
printf(" %d",num[i]);
}
printf("\n");
}
return 0;
}