题目 | Abs Abs Function
AtCoder Regular Contest 155
B - Abs Abs Function
https://atcoder.jp/contests/arc155/tasks/arc155_b
Time Limit: 2 sec / Memory Limit: 1024 MB
Score :
Problem Statement
For a set
We have a set
Process
- If
, add to the pair of non-negative integers. - If
, print the minimum value of for a non-negative integer such that .
Constraints
is or .- If
, then . - There is at least one query with
. - All values in the input are integers.
Input
The input is given from Standard Input in the following format:
Output
For each query with
Sample Input 1
4 0 5
1 3 11
2 7 8
1 8 2
2 8 9
Sample Output 1
2
1
In the second query,
In the fourth query,
Sample Input 2
2 1 2
1 2 3
2 2 6
Sample Output 2
0
Sample Input 3
20 795629912 123625148
2 860243184 892786970
2 645778367 668513124
1 531411849 174630323
1 635062977 195695960
2 382061637 411843651
1 585964296 589553566
1 310118888 68936560
1 525351160 858166280
2 395304415 429823333
2 583145399 703645715
2 97768492 218377432
1 707220749 459967102
1 210842017 363390878
2 489541834 553583525
2 731279777 811513313
1 549864943 493384741
1 815378318 826084592
2 369622093 374205455
1 78240781 821999998
2 241667193 243982581
Sample Output 3
26468090
3491640
25280111
9543684
0
22804896
20649370
19245624
4849993
484865
题解
核心思路
将函数
函数图像如下:
通过变形,该函数的最小值点就很明确了,就是
完整思路
我们将每对
当要输出答案时,
- 若
,那么 取 即可令某一个 ,取最小值后 - 若
,那么 取距离 或距离 最近的一个 即可令 最小,
代码
#include <bits/stdc++.h>
#define endl '\n'
#define int long long
using namespace std;
signed main()
{
ios_base::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int Q, A, B;
cin >> Q >> A >> B;
set<int> s;
s.insert(A + B);
s.insert(A - B);
while (Q--)
{
int t, a, b;
cin >> t >> a >> b;
if (t == 1)
{
s.insert(a + b);
s.insert(a - b);
}
else
{
auto it = s.lower_bound(a);
if (it == s.end())
cout << a - *s.rbegin() << endl;
else if (*it <= b)
cout << 0 << endl;
else if (it == s.begin())
cout << *it - b << endl;
else
cout << min(*it - b, a - *prev(it)) << endl;
}
}
return 0;
}
本文采用 CC BY-SA 4.0 许可,本文 Markdown 源码:Haotian-BiJi