D題
題意:
把給定的一個數字數列放到對角線上,其他位置填寫min(橫,豎)。
要求找到一個矩形,分別把所有的1,2,3....k 都包含起來
輸出其長+寬
思路:
找到最遠的那個即可,然後(mx - mn + 1) * 2
#include<bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define IOS std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
#define int long long
const int N = 2e6 + 10;
const int mod = 1e9 + 7;
typedef pair<int,int>PII;
int t , n , k , ans[N];
struct node {
int x , id;
}a[N];
signed main(){
IOS
cin >> t;
while(t --) {
cin >> n >> k;
for(int i = 1 ; i <= n ; i ++) {
cin >> a[i].x ;//輸入資料
a[i].id = i;//記錄在對角線上的位置
}
sort(a + 1 , a + 1 + n ,
[&](node a, node b){
return a.x < b.x;
}//按照資料的大小來排序
);
int mx = -9e18 , mn = 9e18;
for(int i = n ; i >= 1 ; i --){
int now = a[i].x;//最大值,
int id = a[i].id;//最大值的位置
mx = max(mx , id);//x的列
mn = min(mn , id);//x的行
ans[now] = (mx - mn + 1) * 2;
}
for(int i = 1 ; i <= k ; i ++) {
cout << ans[i] << " ";
ans[i] = 0;
}
cout << "\n";
}
return 0;
}
//freopen("檔名.in","r",stdin);
//freopen("檔名.out","w",stdout);