CF1852B Imbalanced Arrays 题解
CF1852B Imbalanced Arrays 题解
Links
Description
对于一个给定的长度为
-
且 。即每个数在 内且不为 。 -
。即数组内不存在一对相反数。 -
。即对于任意的 ,数组中与 和大于 的数的个数恰好为 。注意:这里需要计算本身。也即 与 可以相等。
请构造长度为
多组测试数据。
Solution
手模了一下数据。发现绝对值最大的数很有意义。假设这个数下标为
按照上面的思路,我们只能求出一个数,如何才能把这个思路延续下去呢,我们发现可以不考虑这个数,将序列的长度减
于是每个数就都可以根据序列能剩余数的数量确定。
如果上面没看懂就来看一下实现吧,首先方便找最大数和
read(n); for(int i = 1;i <= n;i++) { read(nums[i].first); nums[i].second = i; } sort(nums + 1,nums + n + 1); reverse(nums + 1,nums + n + 1);
接下来开始枚举。用 det
记录整个序列被减去的值。
判断两种无解的情况,并计算当前数的答案。由于每次都会减少一个数,因此数组中的数绝对值互不相同,满足了第一个条件。
int tail = n,det = 0; for(int i = 1;i <= tail;i++) { if(nums[i].first - det == tail - i + 1 && nums[tail].first - det <= 0) { puts("NO"); return ; } if(nums[i].first - det != tail - i + 1 && nums[tail].first - det != 0) { puts("NO"); return ; } if(nums[i].first - det == tail - i + 1) { ans[nums[i].second] = tail - i + 1; ++det; } else { ans[nums[tail].second] = -(tail - i + 1); --tail; --i; } }
Codes
#include <bits/stdc++.h> using namespace std; #define int long long #define max_n 520011 void read(int &p) { p = 0; int k = 1; char c = getchar(); while(c < '0' || c > '9') { if(c == '-') { k = -1; } c = getchar(); } while(c >= '0' && c <= '9') { p = p * 10 + c - '0'; c = getchar(); } p *= k; return ; } void write_(int x) { if(x < 0) { putchar('-'); x = -x; } if(x > 9) { write_(x / 10); } putchar(x % 10 + '0'); } void writesp(int x) { write_(x); putchar(' '); } void writeln(int x) { write_(x); puts(""); } int T; int n; pair<int,int> nums[max_n]; int ans[max_n]; void solution() { read(n); for(int i = 1;i <= n;i++) { read(nums[i].first); nums[i].second = i; } sort(nums + 1,nums + n + 1); reverse(nums + 1,nums + n + 1); int tail = n,det = 0; for(int i = 1;i <= tail;i++) { if(nums[i].first - det == tail - i + 1 && nums[tail].first - det <= 0) { puts("NO"); return ; } if(nums[i].first - det != tail - i + 1 && nums[tail].first - det != 0) { puts("NO"); return ; } if(nums[i].first - det == tail - i + 1) { ans[nums[i].second] = tail - i + 1; ++det; } else { ans[nums[tail].second] = -(tail - i + 1); --tail; --i; } } puts("YES"); for(int i = 1;i <= n;i++) { writesp(ans[i]); } puts(""); } signed main() { read(T); while(T--) { solution(); } return 0; }
本文来自博客园,作者:cn_ryh,转载请注明原文链接:https://www.cnblogs.com/yuhang-ren/p/solution-CF1852.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步