题解:CF2037B Intercepted Inputs

Sakura_Emilia

2024-11-20 02:32:37

Solution

Solution

对于每组数据读入的 k 个数,由于有两个数是决定网格的宽度和高度,因此矩形区域的面积一定是 k-2。因此只需要检查这 k 个数中,有没有两个数的乘积,恰好为 k-2。使用 map<int, int> 打个桶即可。

这里特别需要注意矩形区域为正方形的情况,因此在读入 k 个数时,一定要先检查此时是否可以构造,再来记录。mp[k]++; 更新要放置在 mp[(n - 2) / k] > 0 判断的后面。

Code

#pragma GCC optimize(2)
#include <bits/stdc++.h>
#define Ciallo main
#define int long long
using namespace std;

int T, n, k, ans1, ans2;
map<int, int> mp;

inline void solve() {
    cin >> n;
    mp.clear();
    for(int i = 1; i <= n; i++) {
        cin >> k;
        if((n - 2) % k == 0) {
            if(mp[(n - 2) / k] > 0)
                ans1 = k, ans2 = (n - 2) / k;
            mp[k]++;
        }
    }

    cout << ans1 << " " << ans2 << endl;
}

signed Ciallo() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr), cout.tie(nullptr);

    cin >> T;
    while(T--)
        solve();

    return 0;
}