文章目录
Problem A. 小水獭游河南(暴力)
因为要求第一段所有位都不同,所以只需要枚举前26个就可以了,后面的暴力判断即可
注意要特判只有一个字母的情况
#include <bits/stdc++.h>
using namespace std;
#define int long long
using i64 = long long;
typedef pair<int, int> PII;
typedef pair<int, char> PIC;
typedef pair<double, double> PDD;
typedef pair<int, PII> PIII;
typedef pair<int, pair<int, bool>> PIIB;
const int N = 2e5 + 10;
const int maxn = 1e6 + 10;
const int mod = 998244353;
const int mod1 = 954169327;
const int mod2 = 906097321;
const int INF = 0x3f3f3f3f3f3f3f3f;
void solve()
{
string s;
cin >> s;
vector<int> cnt(26);
auto check = [&](int start)
{
int idx = 0;
for (int i = start; i + idx < s.size();)
{
if (s[i + idx] != s[s.size() - 1 - idx]) return false;
idx ++ ;
}
return true;
};
for (int i = 0; i < s.size(); i ++ )
{
int num = s[i] - 'a';
cnt[num] ++ ;
if (cnt[num] > 1) break;
if (i + 1 < s.size() && check(i + 1))
{
cout << "HE\n";
return;
}
}
cout << "NaN\n";
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
int t = 1;
cin >> t;
while (t--)
{
solve();
}
}
Problem B. Art for Rest(前缀和)
只需要维护一下前缀最大值和后缀最小值即可,遍历每段的长度,每次判断交界处前缀最大值是否小于等于后缀最小值,只要有一个地方不等于就不能满足条件
#include <bits/stdc++.h>
using namespace std;
#define int long long
using i64 = long long;
typedef pair<int, int> PII;
typedef pair<int, char> PIC;
typedef pair<double, double> PDD;
typedef pair<int, PII> PIII;
typedef pair<int, pair<int, bool>> PIIB;
const int N = 1e6 + 10;
const int maxn = 1e6 + 10;
const int mod = 998244353;
const int mod1 = 954169327;
const int mod2 = 906097321;
const int INF = 0x3f3f3f3f3f3f3f3f;
void solve()
{
int n;
cin >> n;
vector<int> a(n + 1);
for (int i = 1; i <= n; i ++ ) cin >> a[i];
vector<int> maxx(n + 2), minn(n + 2, INF);
for (int i = 1; i <= n; i ++ ) maxx[i] = max(maxx[i - 1], a[i]);
for (int i = n; i >= 1; i -- ) minn[i] = min(minn[i + 1], a[i]);
int ans = 1;
for (int i = 1; i < n; i ++ )
{
bool flag = true;
for (int j = i + 1; j <= n; j += i)
{
if (maxx[j - 1] > minn[j])
{
flag = false;
break;
}
}
if (flag) ans ++ ;
}
cout << ans << '\n';
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
int t = 1;
// cin >> t;
while (t--)
{
solve();
}
}
Problem C. Toxel 与随机数生成器(暴力)
因为错误随机的循环节在1000-10000之间,所以判断一下字符串的前1000个有没有在后面出现过就可以了
好水的金牌题啊啊啊
#include <bits/stdc++.h>
using namespace std;
#define int long long
using i64 = long long;
typedef pair<int, int> PII;
typedef pair<int, char> PIC;
typedef pair<double, double> PDD;
typedef pair<int, PII> PIII;
typedef pair<int, pair<int, bool>> PIIB;
const int N = 1e6 + 10;
const int maxn = 1e6 + 10;
const int mod = 998244353;
const int mod1 = 954169327;
const int mod2 = 906097321;
const int INF = 0x3f3f3f3f3f3f3f3f;
void solve()
{
string s;
cin >> s;
string tmp = s.substr(0, 1000);
string txt = s.substr(1000, s.size() - 1000);
if (txt.find(tmp) == string::npos) cout << "Yes\n";
else cout << "No\n";
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
int t = 1;
// cin >> t;
while (t--)
{
solve();
}
}
Problem E. 矩阵游戏(dp+滚动数组)
看数据范围基本确定是dp
设 dp[i][j][k]
表示到 [i, j]
这个点,还有 k
次改变机会的最大价值,很容易得到转移方程:
- 如果
g[i][j] == '1'
,有dp[i][j][k] = max(dp[i - 1][j][k], dp[i][j - 1][k]) + 1
- 如果
g[i][j] == '?'
且k < x
,有dp[i][j][k] = max({dp[i - 1][j][k], dp[i][j - 1][k], dp[i - 1][j][k + 1] + 1, dp[i][j - 1][k + 1] + 1})
- 否则,
dp[i][j][k] = max(dp[i][j - 1][k], dp[i - 1][j][k])
发现数据范围不允许我们这样开数组,注意到我们只用到了两层数据,所以开个滚动数组即可
#include <bits/stdc++.h>
using namespace std;
// #define int long long
using i64 = long long;
typedef pair<int, int> PII;
typedef pair<int, char> PIC;
typedef pair<double, double> PDD;
typedef pair<int, PII> PIII;
typedef pair<int, pair<int, bool>> PIIB;
const int N = 1e6 + 10;
const int maxn = 1e6 + 10;
const int mod = 998244353;
const int mod1 = 954169327;
const int mod2 = 906097321;
const int INF = 0x3f3f3f3f3f3f3f3f;
int dp[2][510][1010];
void solve()
{
int n, m, x;
cin >> n >> m >> x;
vector<string> g(n + 1);
for (int i = 1; i <= n; i ++ )
{
cin >> g[i];
g[i] = " " + g[i];
}
for (int i = 0; i < 2; i ++ )
{
for (int j = 1; j <= m; j ++ )
{
for (int k = 0; k <= x; k ++ )
{
dp[i][j][k] = 0;
}
}
}
int nw = 1;
for (int i = 1; i <= n; i ++ )
{
for (int j = 1; j <= m; j ++ )
{
for (int k = 0; k <= x; k ++ )
{
if (g[i][j] == '1') dp[nw][j][k] = max(dp[nw ^ 1][j][k], dp[nw][j - 1][k]) + 1;
else if (g[i][j] == '?' && k != x) dp[nw][j][k] = max({dp[nw ^ 1][j][k], dp[nw][j - 1][k], dp[nw ^ 1][j][k + 1] + 1, dp[nw][j - 1][k + 1] + 1});
else dp[nw][j][k] = max(dp[nw ^ 1][j][k], dp[nw][j - 1][k]);
}
}
nw ^= 1;
}
cout << dp[nw ^ 1][m][0] << '\n';
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
int t = 1;
cin >> t;
while (t--)
{
solve();
}
}
Problem F. Art for Last(单调队列)
首先排序,选择长度为 k 的连续一段一定是最优的,每段的第一个数和最后一个数的差值就是最大差值值,最小差值怎么求呢?固定长度区间内的最小值,想到单调队列,于是做完
#include <bits/stdc++.h>
using namespace std;
#define int long long
using i64 = long long;
typedef pair<int, int> PII;
typedef pair<int, char> PIC;
typedef pair<double, double> PDD;
typedef pair<int, PII> PIII;
typedef pair<int, pair<int, bool>> PIIB;
const int N = 1e6 + 10;
const int maxn = 1e6 + 10;
const int mod = 998244353;
const int mod1 = 954169327;
const int mod2 = 906097321;
const int INF = 0x3f3f3f3f3f3f3f3f;
void solve()
{
int n, k;
cin >> n >> k;
vector<int> a(n + 1);
for (int i = 1; i <= n; i ++ ) cin >> a[i];
sort(a.begin() + 1, a.end());
vector<int> minn(n + 1, INF);
deque<int> q;
for (int i = 2; i <= n; i ++ )
{
if (!q.empty() && i - q.front() >= k) q.pop_front();
while (!q.empty() && a[q.back()] - a[q.back() - 1] >= a[i] - a[i - 1]) q.pop_back();
q.push_back(i);
minn[i] = a[q.front()] - a[q.front() - 1];
}
int ans = INF;
for (int i = k; i <= n; i ++ )
{
ans = min(ans, (a[i] - a[i - k + 1]) * minn[i]);
}
cout << ans << '\n';
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
int t = 1;
// cin >> t;
while (t--)
{
solve();
}
}
Problem G. Toxel 与字符画(大模拟)
首先一看就是个模拟,然后判断结果是否大于 1e18 可以用 int128 莽过去,结束!
#include <bits/stdc++.h>
using namespace std;
#define int long long
using i64 = long long;
using i128 = __int128_t;
typedef pair<int, int> PII;
typedef pair<int, char> PIC;
typedef pair<double, double> PDD;
typedef pair<int, PII> PIII;
typedef pair<int, pair<int, bool>> PIIB;
const int N = 1e6 + 10;
const int maxn = 1e6 + 10;
const int mod = 998244353;
const int mod1 = 954169327;
const int mod2 = 906097321;
const int INF = 0x3f3f3f3f3f3f3f3f;
char g[6][10][10][8];
void init()
{
strcpy(g[0][0][0], "........");
strcpy(g[0][0][1], "........");
strcpy(g[0][0][2], "0000000.");
strcpy(g[0][0][3], "0.....0.");
strcpy(g[0][0][4], "0.....0.");
strcpy(g[0][0][5], "0.....0.");
strcpy(g[0][0][6], "0.....0.");
strcpy(g[0][0][7], "0.....0.");
strcpy(g[0][0][8], "0000000.");
strcpy(g[0][0][9], "........");
strcpy(g[0][1][0], "........");
strcpy(g[0][1][1], "........");
strcpy(g[0][1][2], "......1.");
strcpy(g[0][1][3], "......1.");
strcpy(g[0][1][4], "......1.");
strcpy(g[0][1][5], "......1.");
strcpy(g[0][1][6], "......1.");
strcpy(g[0][1][7], "......1.");
strcpy(g[0][1][8], "......1.");
strcpy(g[0][1][9], "........");
strcpy(g[0][2][0], "........");
strcpy(g[0][2][1], "........");
strcpy(g[0][2][2], "2222222.");
strcpy(g[0][2][3], "......2.");
strcpy(g[0][2][4], "......2.");
strcpy(g[0][2][5], "2222222.");
strcpy(g[0][2][6], "2.......");
strcpy(g[0][2][7], "2.......");
strcpy(g[0][2][8], "2222222.");
strcpy(g[0][2][9], "........");
strcpy(g[0][3][0], "........");
strcpy(g[0][3][1], "........");
strcpy(g[0][3][2], "3333333.");
strcpy(g[0][3][3], "......3.");
strcpy(g[0][3][4], "......3.");
strcpy(g[0][3][5], "3333333.");
strcpy(g[0][3][6], "......3.");
strcpy(g[0][3][7], "......3.");
strcpy(g[0][3][8], "3333333.");
strcpy(g[0][3][9], "........");
strcpy(g[0][4][0], "........");
strcpy(g[0][4][1], "........");
strcpy(g[0][4][2], "4.....4.");
strcpy(g[0][4][3], "4.....4.");
strcpy(g[0][4][4], "4.....4.");
strcpy(g[0][4][5], "4444444.");
strcpy(g[0][4][6], "......4.");
strcpy(g[0][4][7], "......4.");
strcpy(g[0][4][8], "......4.");
strcpy(g[0][4][9], "........");
strcpy(g[0][5][0], "........");
strcpy(g[0][5][1], "........");
strcpy(g[0][5][2], "5555555.");
strcpy(g[0][5][3], "5.......");
strcpy(g[0][5][4], "5.......");
strcpy(g[0][5][5], "5555555.");
strcpy(g[0][5][6], "......5.");
strcpy(g[0][5][7], "......5.");
strcpy(g[0][5][8], "5555555.");
strcpy(g[0][5][9], "........");
strcpy(g[0][6][0], "........");
strcpy(g[0][6][1], "........");
strcpy(g[0][6][2], "6666666.");
strcpy(g[0][6][3], "6.......");
strcpy(g[0][6][4], "6.......");
strcpy(g[0][6][5], "6666666.");
strcpy(g[0][6][6], "6.....6.");
strcpy(g[0][6][7], "6.....6.");
strcpy(g[0][6][8], "6666666.");
strcpy(g[0][6][9], "........");
strcpy(g[0][7][0], "........");
strcpy(g[0][7][1], "........");
strcpy(g[0][7][2], "7777777.");
strcpy(g[0][7][3], "......7.");
strcpy(g[0][7][4], "......7.");
strcpy(g[0][7][5], "......7.");
strcpy(g[0][7][6], "......7.");
strcpy(g[0][7][7], "......7.");
strcpy(g[0][7][8], "......7.");
strcpy(g[0][7][9], "........");
strcpy(g[0][8][0], "........");
strcpy(g[0][8][1], "........");
strcpy(g[0][8][2], "8888888.");
strcpy(g[0][8][3], "8.....8.");
strcpy(g[0][8][4], "8.....8.");
strcpy(g[0][8][5], "8888888.");
strcpy(g[0][8][6], "8.....8.");
strcpy(g[0][8][7], "8.....8.");
strcpy(g[0][8][8], "8888888.");
strcpy(g[0][8][9], "........");
strcpy(g[0][9][0], "........");
strcpy(g[0][9][1], "........");
strcpy(g[0][9][2], "9999999.");
strcpy(g[0][9][3], "9.....9.");
strcpy(g[0][9][4], "9.....9.");
strcpy(g[0][9][5], "9999999.");
strcpy(g[0][9][6], "......9.");
strcpy(g[0][9][7], "......9.");
strcpy(g[0][9][8], "9999999.");
strcpy(g[0][9][9], "........");
strcpy(g[1][0][0], "......");
strcpy(g[1][0][1], "00000.");
strcpy(g[1][0][2], "0...0.");
strcpy(g[1][0][3], "0...0.");
strcpy(g[1][0][4], "0...0.");
strcpy(g[1][0][5], "00000.");
strcpy(g[1][0][6], "......");
strcpy(g[1][0][7], "......");
strcpy(g[1][0][8], "......");
strcpy(g[1][0][9], "......");
strcpy(g[1][1][0], "......");
strcpy(g[1][1][1], "....1.");
strcpy(g[1][1][2], "....1.");
strcpy(g[1][1][3], "....1.");
strcpy(g[1][1][4], "....1.");
strcpy(g[1][1][5], "....1.");
strcpy(g[1][1][6], "......");
strcpy(g[1][1][7], "......");
strcpy(g[1][1][8], "......");
strcpy(g[1][1][9], "......");
strcpy(g[1][2][0], "......");
strcpy(g[1][2][1], "22222.");
strcpy(g[1][2][2], "....2.");
strcpy(g[1][2][3], "22222.");
strcpy(g[1][2][4], "2.....");
strcpy(g[1][2][5], "22222.");
strcpy(g[1][2][6], "......");
strcpy(g[1][2][7], "......");
strcpy(g[1][2][8], "......");
strcpy(g[1][2][9], "......");
strcpy(g[1][3][0], "......");
strcpy(g[1][3][1], "33333.");
strcpy(g[1][3][2], "....3.");
strcpy(g[1][3][3], "33333.");
strcpy(g[1][3][4], "....3.");
strcpy(g[1][3][5], "33333.");
strcpy(g[1][3][6], "......");
strcpy(g[1][3][7], "......");
strcpy(g[1][3][8], "......");
strcpy(g[1][3][9], "......");
strcpy(g[1][4][0], "......");
strcpy(g[1][4][1], "4...4.");
strcpy(g[1][4][2], "4...4.");
strcpy(g[1][4][3], "44444.");
strcpy(g[1][4][4], "....4.");
strcpy(g[1][4][5], "....4.");
strcpy(g[1][4][6], "......");
strcpy(g[1][4][7], "......");
strcpy(g[1][4][8], "......");
strcpy(g[1][4][9], "......");
strcpy(g[1][5][0], "......");
strcpy(g[1][5][1], "55555.");
strcpy(g[1][5][2], "5.....");
strcpy(g[1][5][3], "55555.");
strcpy(g[1][5][4], "....5.");
strcpy(g[1][5][5], "55555.");
strcpy(g[1][5][6], "......");
strcpy(g[1][5][7], "......");
strcpy(g[1][5][8], "......");
strcpy(g[1][5][9], "......");
strcpy(g[1][6][0], "......");
strcpy(g[1][6][1], "66666.");
strcpy(g[1][6][2], "6.....");
strcpy(g[1][6][3], "66666.");
strcpy(g[1][6][4], "6...6.");
strcpy(g[1][6][5], "66666.");
strcpy(g[1][6][6], "......");
strcpy(g[1][6][7], "......");
strcpy(g[1][6][8], "......");
strcpy(g[1][6][9], "......");
strcpy(g[1][7][0], "......");
strcpy(g[1][7][1], "77777.");
strcpy(g[1][7][2], "....7.");
strcpy(g[1][7][3], "....7.");
strcpy(g[1][7][4], "....7.");
strcpy(g[1][7][5], "....7.");
strcpy(g[1][7][6], "......");
strcpy(g[1][7][7], "......");
strcpy(g[1][7][8], "......");
strcpy(g[1][7][9], "......");
strcpy(g[1][8][0], "......");
strcpy(g[1][8][1], "88888.");
strcpy(g[1][8][2], "8...8.");
strcpy(g[1][8][3], "88888.");
strcpy(g[1][8][4], "8...8.");
strcpy(g[1][8][5], "88888.");
strcpy(g[1][8][6], "......");
strcpy(g[1][8][7], "......");
strcpy(g[1][8][8], "......");
strcpy(g[1][8][9], "......");
strcpy(g[1][9][0], "......");
strcpy(g[1][9][1], "99999.");
strcpy(g[1][9][2], "9...9.");
strcpy(g[1][9][3], "99999.");
strcpy(g[1][9][4], "....9.");
strcpy(g[1][9][5], "99999.");
strcpy(g[1][9][6], "......");
strcpy(g[1][9][7], "......");
strcpy(g[1][9][8], "......");
strcpy(g[1][9][9], "......");
strcpy(g[2][0][0], "........");
strcpy(g[2][0][1], "........");
strcpy(g[2][0][2], "........");
strcpy(g[2][0][3], "........");
strcpy(g[2][0][4], "=======.");
strcpy(g[2][0][5], "........");
strcpy(g[2][0][6], "=======.");
strcpy(g[2][0][7], "........");
strcpy(g[2][0][8], "........");
strcpy(g[2][0][9], "........");
strcpy(g[3][0][0], "........");
strcpy(g[3][0][1], "........");
strcpy(g[3][0][2], "IIIIIII.");
strcpy(g[3][0][3], "...I....");
strcpy(g[3][0][4], "...I....");
strcpy(g[3][0][5], "...I....");
strcpy(g[3][0][6], "...I....");
strcpy(g[3][0][7], "...I....");
strcpy(g[3][0][8], "IIIIIII.");
strcpy(g[3][0][9], "........");
strcpy(g[4][0][0], "........");
strcpy(g[4][0][1], "........");
strcpy(g[4][0][2], "N.....N.");
strcpy(g[4][0][3], "NN....N.");
strcpy(g[4][0][4], "N.N...N.");
strcpy(g[4][0][5], "N..N..N.");
strcpy(g[4][0][6], "N...N.N.");
strcpy(g[4][0][7], "N....NN.");
strcpy(g[4][0][8], "N.....N.");
strcpy(g[4][0][9], "........");
strcpy(g[5][0][0], "........");
strcpy(g[5][0][1], "........");
strcpy(g[5][0][2], "FFFFFFF.");
strcpy(g[5][0][3], "F.......");
strcpy(g[5][0][4], "F.......");
strcpy(g[5][0][5], "FFFFFFF.");
strcpy(g[5][0][6], "F.......");
strcpy(g[5][0][7], "F.......");
strcpy(g[5][0][8], "F.......");
strcpy(g[5][0][9], "........");
}
void solve()
{
string s;
cin >> s;
int st = 0;
int a = 0, b = 0;
for (int i = 0; i < s.size(); i ++ )
{
if (s[i] == '{' || s[i] == '^')
{
st = 1;
continue;
}
else if (s[i] == '}') break;
if (st == 0) a = a * 10 + (s[i] - '0');
else b = b * 10 + (s[i] - '0');
}
st = 0;
string ans;
i128 res = 1;
if (a == 1) res = 1;
else
{
for (int i = 0; i < b; i ++ )
{
res = res * a;
if (res > 1e18)
{
res = -1;
break;
}
}
}
if (res == -1) ans = "INF";
else
{
int tmp = res;
ans = to_string(tmp);
}
s = s + "=" + ans;
for (int i = 0; i < 10; i ++ )
{
cout << '.';
for (int j = 0; j < s.size(); j ++ )
{
if (s[j] == '{' || s[j] == '^')
{
st = 1;
continue;
}
else if (s[j] == '}')
{
st = 0;
continue;
}
if (s[j] == '=')
{
for (int k = 0; k < 8; k ++ ) cout << g[2][0][i][k];
continue;
}
else if (s[j] == 'I')
{
for (int k = 0; k < 8; k ++ ) cout << g[3][0][i][k];
continue;
}
else if (s[j] == 'N')
{
for (int k = 0; k < 8; k ++ ) cout << g[4][0][i][k];
continue;
}
else if (s[j] == 'F')
{
for (int k = 0; k < 8; k ++ ) cout << g[5][0][i][k];
continue;
}
int num = s[j] - '0';
if (st == 0) for (int k = 0; k < 8; k ++ ) cout << g[st][num][i][k];
else if (st == 1) for (int k = 0; k < 6; k ++ ) cout << g[st][num][i][k];
}
cout << '\n';
}
cout << '\n';
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
init();
int t = 1;
cin >> t;
while (t--)
{
solve();
}
}
Problem H. Travel Begins(贪心)
-
最大值:前 k-1 个数选 0.5,剩下的丢给最后一个数
-
最小值:前 k-1 个数选 0.4999999,极限可以当做 0.5 计算,剩下的丢给最后一个数
需要注意一下选 k-1 个 0.5 超过 n 的情况
#include <bits/stdc++.h>
using namespace std;
#define int long long
using i64 = long long;
using i128 = __int128_t;
typedef pair<int, int> PII;
typedef pair<int, char> PIC;
typedef pair<double, double> PDD;
typedef pair<int, PII> PIII;
typedef pair<int, pair<int, bool>> PIIB;
const int N = 1e6 + 10;
const int maxn = 1e6 + 10;
const int mod = 998244353;
const int mod1 = 954169327;
const int mod2 = 906097321;
const int INF = 0x3f3f3f3f3f3f3f3f;
void solve1(int n, int k)
{
double tmp1 = 0.5 * (k - 1);
int ans2 = n - tmp1;
int ans =0;
if (n - tmp1 - ans2 >= 0.5) ans ++ ;
ans += ans2;
cout << max((i64)0, (int)ans) << ' ';
}
void solve2(int n, int k)
{
double tmp1 = 0.5 * (k - 1);
if (n < tmp1)
{
int ans1 = n / 0.5;
cout << ans1 << '\n';
}
else
{
int ans2 = n - tmp1;
int ans = k - 1;
if (n - tmp1 - ans2 >= 0.5) ans ++ ;
ans += ans2;
cout << ans << '\n';
}
}
void solve()
{
int n, k;
cin >> n >> k;
solve1(n, k);
solve2(n, k);
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
int t = 1;
cin >> t;
while (t--)
{
solve();
}
}
Problem K. 排列与质数(思维)
找不到啥规律,想到升序排列奇数,降序排列偶数
发现不满足条件的只有两个地方,中间交界的地方 n-1,末尾的 2
2 放在 5 7 之间非常合适,于是挪过去,1 和 4 也符合条件
n - 1 可以放在 n - 4 和 n - 6 之间
特判一下不能用这个方法的情况,即 n<6 n=8 n=11
#include <bits/stdc++.h>
using namespace std;
#define int long long
using i64 = long long;
using i128 = __int128_t;
typedef pair<int, int> PII;
typedef pair<int, char> PIC;
typedef pair<double, double> PDD;
typedef pair<int, PII> PIII;
typedef pair<int, pair<int, bool>> PIIB;
const int N = 1e6 + 10;
const int maxn = 1e6 + 10;
const int mod = 998244353;
const int mod1 = 954169327;
const int mod2 = 906097321;
const int INF = 0x3f3f3f3f3f3f3f3f;
void solve()
{
int n;
cin >> n;
if (n <= 4) cout << -1 << '\n';
else if (n == 5) cout << "4 1 3 5 2\n";
else if (n == 6) cout << "1 6 3 5 2 4\n";
else if (n == 8) cout << "1 3 5 7 2 4 6 8\n";
else if (n == 11) cout << "1 3 10 5 2 7 9 11 8 6 4\n";
else
{
if (n & 1)
{
for (int i = 1; i <= n; i += 2)
{
cout << i << ' ';
if (i == 5) cout << 2 << ' ';
if (i == n - 6) cout << n - 1 << ' ';
}
for (int i = n - 3; i >= 4; i -= 2) cout << i << ' ';
cout << '\n';
}
else
{
for (int i = 1; i <= n - 2; i += 2)
{
cout << i << ' ';
if (i == 5) cout << 2 << ' ';
}
for (int i = n; i >= 4; i -= 2)
{
cout << i << ' ';
if (i == n - 4) cout << n - 1 << ' ';
}
cout << '\n';
}
}
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
int t = 1;
cin >> t;
while (t--)
{
solve();
}
}