日常训练2025-1-19
C. Light Switches
rating:1500
https://codeforces.com/problemset/problem/1993/C
思路(Trick)
首先明确一点,当所有的芯片安装完成后,才有可能所有的灯会亮
可以求出芯片安装时刻的最大值max_val
然后就是芯片装好一瞬间就会亮,周期是2k,
现在需要考虑的就是每一个芯片安装时刻到所有装完(max_val)这一段时间是否满足在k内即可
代码
#include <bits/stdc++.h>typedef std::pair<long long, long long> pll;
typedef std::pair<int, int> pii;
#define INF 0x3f3f3f3f
#define MOD 998244353
using i64 = long long;
const int N = 1e5+5;void solve(){int n, k;std::cin >> n >> k;int maxx = 0;std::vector<int> a(n+1);for (int i = 1; i <= n; i++) {std::cin >> a[i];maxx = std::max(a[i], maxx);} // l:最后一个灯安装时,没亮的灯中最晚亮的灯需要走l步。// r:最后一个灯安装时,亮的灯中最早灭的灯在r步后才会灭int l = 0, r = k;for (int i = 1; i <= n; i++){int x = (maxx - a[i]) % (2 * k);if (x == k){l = r + 1;break;}if (x < k){r = std::min(r, k - x - 1);}if (x > k){l = std::max(l, 2*k - x);}}if (l > r){std::cout << "-1\n";}else{std::cout << maxx + l << '\n';}
}signed main()
{std::ios::sync_with_stdio(false);std::cin.tie(nullptr);std::cout<<std::setiosflags(std::ios::fixed)<<std::setprecision(2);int t = 1, i;std::cin >> t;for (i = 0; i < t; i++){solve();}return 0;
}