嘘~ 正在从服务器偷取页面 . . .

CF1416B Make Them Equal 题解


CF1416B Make Them Equal 题解

题目链接:Make Them Equal

题意

给出一个序列 \(a\),求出一个长度不超过 \(3n\) 的操作序列,使序列 \(a\) 中每个元素相等。

定义一次操作为:选出 \((i,j,x)\) 三元组,满足 \(i,j\) 为序列合法下标,\(x\)\(10^9\) 以内非负整数,令 \(a_i\gets a_i-x\cdot i,a_j\gets a_j+x\cdot i\)

必须保证操作过程中的任意时刻序列 \(a\) 中每个元素都非负。

输出时先输出操作次数 \(k\),然后输出 \(k\) 行操作序列。

数据组数 \(t\le10^4\),序列长度 \(\sum n\le10^4\),元素大小 \(1\le a_i\le10^5\)

感觉这种题目很喜欢找到一种,就像游戏机制一样的性质,使劲钻空子。

首先如果 \(n \not\mid \sum a_i\) 一定无解,因为最终每个数一定会变成平均数。

注意到 \(i=1\) 的自由度最高,如果所有的多余的值都放在 \(i=1\) 上那么这道题就非常简单了。

考虑用以下方案移动 \(i \in [2,n]\)\(a_i\) 的值:

  1. \(a_1\)\(a_i\) 补成 \(i\) 的倍数
  2. \(a_i\) 移到 \(a_1\) (即 \(a_1 \gets a_i,~a_i \gets 0\)

最后,处理完所有的 \(i\) 后,把 \(a_1\) 均分给每个 \(a_i\)

这个方案唯一的疑点就是第一步 \(a_1\) 有没有足够的值去填补。

事实上一定是有的:显然 \(a_i \ge 1\) ,因此在处理到第 \(i\) 个数时 \(a_1=\left(\sum_{1\le l < i}{a_l}\right) \ge i-1\)​ 。

这样操作数就是 \(3(n-1)\) ,符合题目要求。

时间复杂度 \(\mathcal{O}(n)\)

代码:

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define INF 0x3f3f3f3f3f3f3f3f
void up(int &x,int y) { x < y ? x = y : 0; }
void down(int &x,int y) { x > y ? x = y : 0; }
#define N ((int)(1e5 + 15))

int a[N];
void solve()
{
    int n, sum = 0; cin >> n;
    for(int i = 1; i <= n; i++) { cin >> a[i]; sum += a[i]; }
    if(sum % n) { cout << "-1\n"; return; }
    sum /= n; cout << 3 * (n - 1) << '\n';
    for(int i = 2; i <= n; i++)
    {
        int x = a[i] % i;
        cout << 1 << ' ' << i << ' ' << (i - x) % i << '\n';
        a[1] -= (i - x) % i; a[i] += (i - x) % i;
        cout << i << ' ' << 1 << ' ' << a[i] / i << '\n';
        a[1] += a[i]; a[i] = 0;
    }
    for(int i = 2; i <= n; i++)
    {
        cout << 1 << ' ' << i << ' ' << sum << '\n';
        a[1] -= sum; a[i] += sum;
    }
}
signed main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
    // freopen("check.in","r",stdin);
    // freopen("check.out","w",stdout);
    int qwq; cin >> qwq; while(qwq--) solve();
    return 0;
}

参考文献

[1] https://www.luogu.com.cn/article/f54n6a4j


文章作者: q779
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-ND 4.0 许可协议。转载请注明来源 q779 !
评论
  目录