两个数列

两个数列

有两个正整数数列 a1,a2,,anb1,b2,,bn

现在,已知的信息有:

  1. 数列 a 的各个元素的值。
  2. 数列 b 的各个元素之和 s
  3. 对于任意的 1in,满足 1biai 成立。

利用给出的信息,我们可以对数列 b 中各个元素的值进行推断。

由上述信息,我们可知对于元素 bi,其可能的取值范围为 [1,ai],但是受到已知条件的约束,它可能无法取到其中一些数值。

我们的任务就是计算每个 bi 在其可能的取值范围内,无法取到的数值的数量。

例如,如果 n=2a={4,4}s=8,则数列 b 中的每一个元素都不能小于 4(否则,另一个元素就要大于 4,这是不可能的),也就是说 b1b2 在其可能的取值范围 [1,4] 内,均无法取到 1,2,3,无法取到的数值的数量均为 3

输入格式

第一行包含两个整数 ns

第二行包含 n 个整数 a1,a2,,an

输出格式

共一行,n 个整数,其中第 i 个整数表示 bi 在其可能的取值范围内,无法取到的数值的数量。

数据范围

前三个测试点满足 1n2
所有测试点满足 1n2×105nsi=1nai1ai106

输入样例1:

2 8
4 4

输出样例1:

3 3

输入样例2:

1 3
5

输出样例2:

4

输入样例3:

2 3
2 3

输出样例3:

0 1

 

解题思路

  每个bi是独立求解的,不需要考虑bi与其他bi的相关性。

  首先bi要满足1biai

  假设所有bi的总和为sumb,用sumbi来表示除了bi其他的b的和,即sumbi=sumbbi。同理,用sumai来表示除了ai其他的a的和。

  那么就有sumbi+bi=sumbbi=sumbsumbi

  我们要求bi的取值范围,那么先求sumbi的取值范围。

  由于每个都有1biai,因此有n1sumbisumai=sumaai(sumaai)sumbi(n1),因此有sumb(sumaai)sumbsumbisumb(n1)

  即sumb(sumaai)bisumb(n1)。同时bi要满足1biai,因此最后我们求这两个不等式的交集就可以了。

  因为题目的数据范围保证每个bi都可以取到值,因此这两个不等式一定会有交集。

  AC代码如下:

复制代码
 1 #include <cstdio>
 2 #include <algorithm>
 3 using namespace std;
 4 
 5 typedef long long LL;
 6 
 7 const int N = 2e5 + 10;
 8 
 9 LL a[N];
10 
11 int get(LL a, LL b, LL c, LL d) {
12     return min(b, d) - max(a, c) + 1;   // 两个区间的交集为左端点的最大值与右端点的最小值
13 }
14 
15 int main() {
16     LL n, sb;
17     scanf("%lld %lld", &n, &sb);
18     
19     LL sa = 0;
20     for (int i = 0; i < n; i++) {
21         scanf("%lld", a + i);
22         sa += a[i];
23     }
24     
25     for (int i = 0; i < n; i++) {
26         printf("%d ", a[i] - get(1, a[i], sb - (sa - a[i]), sb - (n - 1)));
27     }
28     
29     return 0;
30 }
复制代码

 

参考资料

  AcWing 4315. 两个数列(AcWing杯 - 周赛):https://www.acwing.com/video/3740/

posted @   onlyblues  阅读(115)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效
Web Analytics
点击右上角即可分享
微信分享提示