トピック:長さがnの偶数の配列を指定すると、要素を一度にk以下の値に変更できます。それぞれの[i] + a [n-i + 1]が等しいことを要求し、操作の最小数を見つけるタイムズ
解決策:各ペアの合計が合計で、小さい方がmn、大きい方がmxであるとします。
[2,2 * k]のすべての数xを列挙します。
:私たちそれぞれが検討事項の対応する番号を持って、3例がある変更番号、変更番号2、ない変更は、
1.数値を変更する場合:x∈[mn + 1、mx + k]; ==》 b [mn + 1] +、1、b [mx + k + 1] -1の場合;
2. 2つの数値:x∈[2、mn]の場合|| [mx + k + 1,2 * k]; ==》 b [2] + 2、b [mn + 1] -2; b [ mx + k + 1] + 2、b [2 * k](最後のもの、変更する必要はありません)
3.変更しないでください:x == sum
そのため、対数ごとに差分配列b [i]を記録し、間隔を維持してから復元します。
コード:
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cmath> 5 #include <algorithm> 6 #include <stack> 7 #include <queue> 8 #include <vector> 9# include <map> 10 #include < set > 11 #include <unordered_set> 12 #include <unordered_map> 13 #define ll long long 14 #define fi first 15 #define se second 16 #define pb push_back 17 #define me memset 18 const int N = 1e6 + 10 ; 19 const int mod = 1e9 + 7 ; 20 名前空間std を使用 。 21 typedefペア< int、int > PII; 22 typedefペア< long、long > PLL; 23 24 int t; 25 int n、k、a [N]; 26 int sum; 27 int mx、mn; 28 int main(){ 29 ios :: sync_with_stdio(false ); 30 cin >> t; 31 while(t-- ){ 32 cin >> n >> k; 33 int b [ 2 * k + 10 ]; 34 me(b、0、sizeof (b)); 35 for(int i = 1 ; i <= n; ++ i)cin >> a [i]; 36 37 のために(INT iは= 1 ; I <= N / 2 ; ++ {I) 38 合計= [I] + [N-I + 1]; 39 mn = min(a [i]、a [n-i + 1 1 ]); 40 mx = max(a [i]、a [n-i + 1 ]); 41 42 b [ 2 ] + = 2 ; 43 b [mn + 1 ]- ; 44 b [mx + k + 1 ] ++ ; 45 b [合計]- ; 46 b [合計+ 1 ] ++ ; 47 } 48 int res = b [ 2 ]; 49 のための(int型 I =3 ; i <= 2 * k; ++ i){ 50 b [i] + = b [i- 1 ]; 51 res = min(res、b [i]); 52 } 53 printf(" %d \ n " 、res); 54 } 55 56 return 0 ; 57 }