CF-Round #631-div2-B题
B. Dreamoon Likes Permutations
这道题是关于序列permutation的模拟题=-=不难。主要是处理方面我当时没有想到好的解决方法。
然后题目当时理解错了emmm。
题目大意:给你一个长度为n的数组。让你拆分成两个序列。输出拆分的个数和每次拆分的长度。
先开始我就直接标记vis[]了一番。(我以为可以改变顺序emmm
后来检查样例发现不对劲。。。
才发现所给的数组是不能改变顺序的。。
然后重新改。
题目是问你是否可以分割成两个序列。(不是组成emm)
然后就可以开始我们的模拟部分了
我们可以得到出现的最大的数字。这个最大的数字其实就是我们分割的某一个序列的长度。另外一个就是n-maxx;
然后遍历标记一下看看满不满足序列要求。
然后交换一下看看符合要求不
注意一点:如果maxx长度等于n/2;那么代表分割的两个序列是相等的。就不需要反转了。直接输出就行。
答案储存在ans[N][2]中;
还是很简单的~
提醒自己不要看错题!!
代码部分:
#include <bits/stdc++.h>
#define mst(a, n) memset(a, n, sizeof(a))
using namespace std;
const int N = 2e5 + 10;
int a[N];
int n;
int cnt;
int vis[N];
int ans[N][2];
int solve(int p[], int k)
{
for (int i = 1; i <= k; i++)
{
vis[i] = 0;
}
for (int i = 0; i < k; i++)
{
vis[p[i]] = 1;
}
for (int i = 1; i <= k; i++)
{
if (!vis[i])
{
return 0;
}
}
return 1;
}
int main()
{
int t;
cin >> t;
while (t--)
{
cnt = 0;
cin >> n;
mst(vis, 0);
int maxx = 0;
for (int i = 1; i <= n; i++)
{
cin >> a[i];
if (maxx < a[i])
{
maxx = a[i];
}
}
if (solve(a + 1, n - maxx) && solve(a + 1 + n - maxx, maxx))
{
ans[cnt][0] = n - maxx;
ans[cnt++][1] = maxx;
}
if (n != maxx * 2 && solve(a + 1, maxx) && solve(a + 1 + maxx, n - maxx))
{
ans[cnt][0] = maxx;
ans[cnt++][1] = n - maxx;
}
cout << cnt << endl;
for (int i = 0; i < cnt; i++)
{
cout << ans[i][0] << " " << ans[i][1] << endl;
}
}
return 0;
}