2019 ICPC 南京网络赛 F Greedy Sequence
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:
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.
樣例輸入復(fù)制
2 3 1 3 2 1 7 2 3 1 4 6 2 5 7樣例輸出復(fù)制
1 2 3 1 1 2 3 2 3 3這題是隊(duì)友出的,這個(gè)題好像線(xiàn)段樹(shù)能做,但是我們是暴力加貪心做的,前幾遍是枚舉的區(qū)間位置純暴力,后來(lái)是枚舉左右區(qū)間長(zhǎng)度,對(duì)于每個(gè)元素的下一個(gè)元素都是唯一固定的。之后記憶化搜索就可以求出每個(gè)序列。
#include<stdio.h> #include<algorithm> #include<iostream> #include<string.h> #include<math.h> #include<vector> #include<queue> #include<map> using namespace std; #define LL long long #define MAXN 100100 int a[MAXN],pos[MAXN]; int s[MAXN],oo[MAXN]; int main() {int t;scanf("%d",&t);int n,k,l,r,maxx;while(t--){scanf("%d%d",&n,&k);for(int i=1;i<=n;i++){scanf("%d",a+i);pos[a[i]]=i;s[i]=1;}s[0]=0;for(int i=2;i<=n;i++){int j=i-1;while(j>0){if(abs(pos[i]-pos[j])<=k){s[i]+=s[j];break;}j--;}}for(int i=1;i<=n;i++){printf("%d",s[i]);if(i<n)printf(" ");}printf("\n");} }?
總結(jié)
以上是生活随笔為你收集整理的2019 ICPC 南京网络赛 F Greedy Sequence的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Win10怎么打开立体声混音选项 Win
- 下一篇: 关于SPFA Bellman-Ford