CF1244G Running in Pairs

CF1244G Running in Pairs

题目的字面意思

       改变两个序列的顺序,然后使得sum(max(a[i], b[i]))是小于等于 m 的最大值,输出这样的两个序列,不行就输出 -1。A序列和B序列都是从1 到 n。

  n 的范围时候 2e5   m 的范围是 n 到 n2

例如

1 2 3 4 5

5 4 3 2 1

这样组合那么 sum 值就是 21

先来考虑需要输出 -1 的情况

1 2 3 4 5

1 2 3 4 5

这样的组合就是最小的情况, 也就是(n + 1)* n  /  2 是一个极限值,如果m小于这个极限值, 就是不存在可行的组合

然后我们来思考可行的方法,可以先计算这个m值到最小值的差值,然后从后往前去凑答案就可以,本质是一个构造。

具体请看我丑陋的代码。

 1 #include <stdio.h>
 2 #include <algorithm>
 3 using namespace std;
 4 typedef long long ll;
 5 int ans[1000009];
 6 int main()
 7 {
 8     ll n, m, minn, diff, pos;
 9     scanf("%lld %lld", &n, &m);
10     minn = (1+n) * n / 2;
11     if(m<minn) printf("-1\n");
12     else{
13         diff = m - minn;
14         pos = 1;
15         for(int i = 1; i <= n; i++) ans[i] = i;
16         for(int i = n; i > pos && diff; i--)
17         {
         // 模拟替换的过程
18 if(i-pos<=diff) 19 { 20 diff -= (i - pos); 21 swap(ans[i], ans[pos]); 22 pos++; 23 }else{ 24 swap(ans[i], ans[i-diff]); 25 diff = 0; 26 } 27 } 28 printf("%lld\n", m - diff); 29 for(int i = 1; i <= n; i++) 30 printf("%d%c", i, i==n?'\n':' '); 31 for(int i = 1; i <= n; i++) 32 printf("%d%c", ans[i], i==n?'\n':' '); 33 } 34 }
原文地址:https://www.cnblogs.com/loenvom/p/11876388.html