The solution of「P16394 回响形态」- 构造
\textup{P16394 回响形态}
\textup{Solution}
此时序列是
a = [1, 2, \cdots, j, n, j + 1, \cdots, n - 1] 。这种调整方法是跨度较大的,我们只能调到保证正好不大于
k 然后继续微调。第二步,根据前面的推导,我们在
n 出现之前的位置的代价是i - 1 。而因为已经遇到了
1 和n ,从j 那一位开始每一位就固定为n-1 了。考虑通过动
j 这个位置来凑代价,如果当前还需要多少代价我们就把j 和后面已经固定代价的部分的某个数交换来凑齐。这一定是可行的,因为我们需要的数一定在后面又出现,且在第一步调整的时候保证了此时不会大于
k 。
\textup{Code}
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int MAXN = 2e5 + 10;
const int inf = 0x3f3f3f3f3f3f3f3f;
const int MOD = 1e9 + 7;
int N, K;
int a[MAXN], b[MAXN];
//----------------------打表用的暴力,需要自取
bool vis[MAXN], flg, flg1;
void dfs( int dep ){
if( flg && flg1 ) return;
if( dep > N ){
if( flg && flg1 ) return;
int k = 0, maxx = 0, minn = inf;
for( int i = 1; i <= N; i ++ ){
maxx = max( maxx, a[i] );
minn = min( minn, a[i] );
k += maxx - minn;
}
if( k == K ){
if( flg ) flg1 = true;
else flg = true;
for( int i = 1; i <= N; i ++ ){
cout << a[i] << " ";
}
cout << endl;
}
return;
}
for( int i = 1; i <= N; i ++ ){
if( vis[i] ) continue;
vis[i] = true;
a[dep] = i;
dfs( dep + 1 );
vis[i] = false;
}
}
//---------------------------------
void slove(){
int cnt = 0;
flg = flg1 = false;
cin >> N >> K;
for( int i = N - 1; i >= 1; i -- ) cnt += i;
if( K < cnt || K > ( N - 1 ) * ( N - 1 ) ){//判无解
cout << "-1\n";
return;
}
int neeed = K - cnt, m = 0;//计算还有多少贡献需要加回去
while( ( m + 1 ) * ( m + 2 ) / 2 <= neeed ) m ++;
neeed -= m * ( m + 1 ) / 2;//第一步
int j = N - m - 1, k;
for( k = 1; k < j; k ++ ) a[k] = k;//前i位不动
a[k ++] = j + neeed;//第二步
a[k ++] = N;
for( int i = j; i <= N - 1; i ++ )
if( i != j + neeed ) a[k ++] = i;//把剩下的数按顺序放回去
for( int i = 1; i <= N; i ++ ) cout << a[i] << " ";
cout << endl;
for( int i = 1; i <= N; i ++ ) cout << N - a[i] + 1 << " ";
cout << endl;
}
signed main(){
ios::sync_with_stdio( 0 );
cin.tie( 0 ), cout.tie( 0 );
// freopen( "star.in", "r", stdin );
// freopen( "star.out", "w", stdout );
int T = 1;
cin >> T;
while( T -- )
slove();
return 0;
}
\textup{Last}
审核管理员辛苦了,如果您有所疑惑或我有所错漏,请您在评论区指出或找我,我会一定解答并且修改本题解。
如果您觉得本文写的还不错,那可以留个赞吗?
谢谢你看到这里~