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 }