题解:AT_arc112_b [ARC112B] -- - B

更好的阅读体验?

题面

[ARC112B] – - B

题面翻译

初始有一个数 B B B, 然后他通过支付一定的钱来使这个数变为另外一个数,可以使用无数次的以下两个操作,

1.支付一元让这个数乘 − 1 -1 1

2.支付两元使这个数减 1 1 1

问在最多 C C C 元的情况下可以得到多少个数?

题目描述

すぬけくんは、整数 B B B を持って整数やさんを訪れました。 整数やさんでは、お金を払うことで、持っている整数を別の整数にしてもらうことができます。

具体的には、次の 2 2 2 種類のサービスを好きな順で好きなだけ購入することができます。

  1. 円を払い、持っている整数を − 1 -1 1 倍する。
  2. 円を払い、持っている整数から $ $ を引く。

すぬけくんが C C C 円以内で作ることのできる整数は何通りありますか?

输入格式

入力は以下の形式で標準入力から与えられる。

B B B C C C

输出格式

答えを出力せよ。

样例 #1

样例输入 #1
11 2
样例输出 #1
3

样例 #2

样例输入 #2
0 4
样例输出 #2
4

样例 #3

样例输入 #3
112 20210213
样例输出 #3
20210436

样例 #4

样例输入 #4
-211 1000000000000000000
样例输出 #4
1000000000000000422

提示

制約
  • − 1 0 18 ≤   B   ≤   1 0 18 -10^{18}\le\ B\ \le\ 10^{18} 1018 B  1018
  • 1 ≤   C   ≤   1 0 18 1\le\ C\ \le\ 10^{18} 1 C  1018
  • 入力はすべて整数

题解

思路

  • 因为 − 1 × − 1 = 1 -1 \times -1 = 1 1×1=1,所以连续进行 2 2 2 次操作 1 就会变回原来的数。因此,为了让最后生成的数最多,就不能连续进行操作 1。

  • 题目说最多使用 C C C 元,所以这些钱可以不用完

综合以上 2 点,就不难发现最终生成的数可以分成 4 种。

  1. 不进行操作 1,只进行 k k k 次操作 2。

    此时得到的数的集合为
    W = { x ∣ x ∈ Z , B − ⌊ C 2 ⌋ ≤ x ≤ B } W=\left \{ x|x\in \mathbb{Z},B-\left \lfloor \frac{C}{2} \right \rfloor \le x\le B \right \} W={xxZ,B2CxB}

  2. 先进行 1 1 1 次操作 1,再进行 k k k 次操作 2。

    此时得到的数的集合为
    X = { x ∣ x ∈ Z , − B − ⌊ C − 1 2 ⌋ ≤ x ≤ − B } X=\left \{ x|x\in \mathbb{Z},-B-\left \lfloor \frac{C-1}{2} \right \rfloor \le x\le -B \right \} X={xxZ,B2C1xB}

  3. 先进行 k k k 次操作 2,再进行 1 1 1 次操作 1。

    此时得到的数的集合为
    Y = { x ∣ x ∈ Z , − B ≤ x ≤ − B + ⌊ C − 1 2 ⌋ } Y=\left \{ x|x\in \mathbb{Z},-B \le x\le -B+\left \lfloor \frac{C-1}{2} \right \rfloor \right \} Y={xxZ,BxB+2C1}

  4. 先进行 1 1 1 次操作 1,再进行 k k k 次操作 2,最后进行 1 1 1 次操作 1。

    此时得到的数的集合为
    Z = { x ∣ x ∈ Z , B ≤ x ≤ B + ⌊ C − 2 2 ⌋ } Z=\left \{ x|x\in \mathbb{Z}, B \le x \le B+\left \lfloor \frac{C-2}{2} \right \rfloor \right \} Z={xxZ,BxB+2C2}

所以,
a n s = ∣ W ∪ X ∪ Y ∪ Z ∣ = ∣ { x ∣ x ∈ Z , B − ⌊ C 2 ⌋ ≤ x ≤ B + ⌊ C − 2 2 ⌋ } ∪ { x ∣ x ∈ Z , − B − ⌊ C − 1 2 ⌋ ≤ x ≤ − B + ⌊ C − 1 2 ⌋ } ∣ ans=\left | W \cup X \cup Y \cup Z \right | = \left | \left \{ x|x\in \mathbb{Z},B-\left \lfloor \frac{C}{2} \right \rfloor \le x\le B+\left \lfloor \frac{C-2}{2} \right \rfloor \right \} \cup \left \{ x|x\in \mathbb{Z},-B-\left \lfloor \frac{C-1}{2} \right \rfloor \le x\le -B+\left \lfloor \frac{C-1}{2} \right \rfloor \right \} \right | ans=WXYZ= {xxZ,B2CxB+2C2}{xxZ,B2C1xB+2C1}

M = { x ∣ x ∈ Z , B − ⌊ C 2 ⌋ ≤ x ≤ B + ⌊ C − 2 2 ⌋ } M=\left \{ x|x\in \mathbb{Z},B-\left \lfloor \frac{C}{2} \right \rfloor \le x\le B+\left \lfloor \frac{C-2}{2} \right \rfloor \right \} M={xxZ,B2CxB+2C2}

N = { x ∣ x ∈ Z , − B − ⌊ C − 1 2 ⌋ ≤ x ≤ − B + ⌊ C − 1 2 ⌋ } N=\left \{ x|x\in \mathbb{Z},-B-\left \lfloor \frac{C-1}{2} \right \rfloor \le x\le -B+\left \lfloor \frac{C-1}{2} \right \rfloor \right \} N={xxZ,B2C1xB+2C1}

所以
a n s = ∣ M ∣ + ∣ N ∣ − ∣ M ∩ N ∣ ans=\left | M \right | +\left | N \right | -\left | M\cap N\right | ans=M+NMN

代码

#include<bits/stdc++.h>
#define int long long
using namespace std;
int b, c, ans = 0;
signed main() {
	cin.tie(0), cout.tie(0);
	cin >> b >> c;
	if (b == 0) {// b = 0 时,特判
		cout << c / 2 + 1 + (c - 1) / 2;
		return 0;
	}
	int l1 = b - c / 2, r1 = b + (c - 2) / 2;
	int l2 = -b - (c - 1) / 2, r2 = -b + (c - 1) / 2;
	if (b < 0) {// b < 0 时,集合 M 与集合 N 是反的
		swap(l1, l2);
		swap(r1, r2);
	}
	cout << (r1 - l1 + 1) + (r2 - l2 + 1) - (l1 <= r2 ? (r2 - l1 + 1) : 0);
	return 0;
}
  • 26
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值