Atcoder评测机没有ONLINE_JUDGE这个宏!!
A,B巨水题
C - Walk on Multiplication Table
Description
给一个数mul,求满足$x*y=mul \ && min\{x+y-2\}$
$mul \leq 10^{12}$
Solution
由均值不等式可知$x+y \geq 2*\sqrt{xy}$,给定xy,那么$min\{x+y-2\}$一定出现在$\sqrt{xy}$附近,扫一遍即可

1 #include <algorithm>
2 #include <bits/stdc++.h>
3 #include <cctype>
4 #include <cmath>
5 #include <cstdio>
6 #include <cstdlib>
7 #include <cstring>
8 #include <ctime>
9 #include <iostream>
10 #include <map>
11 #include <numeric>
12 #include <queue>
13 #include <set>
14 #include <stack>
15 #if __cplusplus >= 201103L
16 #include <unordered_map>
17 #include <unordered_set>
18 #endif
19 #include <vector>
20 #define lson rt << 1, l, mid
21 #define rson rt << 1 | 1, mid + 1, r
22 #define LONG_LONG_MAX 9223372036854775807LL
23 #define pblank putchar(' ')
24 #define ll LL
25 #define fastIO ios::sync_with_stdio(false), cin.tie(0), cout.tie(0)
26 using namespace std;
27 typedef long long ll;
28 typedef long double ld;
29 typedef unsigned long long ull;
30 typedef pair<int, int> P;
31 ll n, m, k;
32 const int maxn = 1e7 + 10;
33 template <class T>
34 inline T read()
35 {
36 int f = 1;
37 T ret = 0;
38 char ch = getchar();
39 while (!isdigit(ch))
40 {
41 if (ch == '-')
42 f = -1;
43 ch = getchar();
44 }
45 while (isdigit(ch))
46 {
47 ret = (ret << 1) + (ret << 3) + ch - '0';
48 ch = getchar();
49 }
50 ret *= f;
51 return ret;
52 }
53 template <class T>
54 inline void write(T n)
55 {
56 if (n < 0)
57 {
58 putchar('-');
59 n = -n;
60 }
61 if (n >= 10)
62 {
63 write(n / 10);
64 }
65 putchar(n % 10 + '0');
66 }
67 template <class T>
68 inline void writeln(const T &n)
69 {
70 write(n);
71 puts("");
72 }
73 int main(int argc, char const *argv[])
74 {
75 #ifndef ONLINE_JUDGE
76 // freopen("in.txt", "r", stdin);
77 // freopen("out.txt", "w", stdout);
78 #endif
79 n = read<ll>();
80 ll up = (ll)sqrt(n * 1.0);
81 ll res = n - 1;
82 for (ll i = up; i >= 1; i--)
83 if (n % i == 0)
84 {
85 res = i + n / i - 2;
86 break;
87 }
88 writeln(res);
89 return 0;
90 }
D - Water
Description
给一个底部为正方形边长为a,高为b的无盖水瓶,以及x单位体积的水,问最大倾斜多少角度可以使水刚好不溢出。
Solution
赛场降智。只想到第一种情况,测试样例都过不完心态崩了。
贴一张nb网友做的图。

分两种情况讨论就行了,注意转换为角度值。

1 #include <algorithm>
2 #include <cctype>
3 #include <cmath>
4 #include <cstdio>
5 #include <cstdlib>
6 #include <cstring>
7 #include <iomanip>
8 #include <iostream>
9 #include <map>
10 #include <numeric>
11 #include <queue>
12 #include <set>
13 #include <stack>
14 #if __cplusplus >= 201103L
15 #include <unordered_map>
16 #include <unordered_set>
17 #endif
18 #include <vector>
19 #define lson rt << 1, l, mid
20 #define rson rt << 1 | 1, mid + 1, r
21 #define LONG_LONG_MAX 9223372036854775807LL
22 #define pblank putchar(' ')
23 #define ll LL
24 #define fastIO ios::sync_with_stdio(false), cin.tie(0), cout.tie(0)
25 using namespace std;
26 typedef long long ll;
27 typedef long double ld;
28 typedef unsigned long long ull;
29 typedef pair<int, int> P;
30 int n, m, k;
31 const int maxn = 1e5 + 10;
32 template <class T>
33 inline T read()
34 {
35 int f = 1;
36 T ret = 0;
37 char ch = getchar();
38 while (!isdigit(ch))
39 {
40 if (ch == '-')
41 f = -1;
42 ch = getchar();
43 }
44 while (isdigit(ch))
45 {
46 ret = (ret << 1) + (ret << 3) + ch - '0';
47 ch = getchar();
48 }
49 ret *= f;
50 return ret;
51 }
52 template <class T>
53 inline void write(T n)
54 {
55 if (n < 0)
56 {
57 putchar('-');
58 n = -n;
59 }
60 if (n >= 10)
61 {
62 write(n / 10);
63 }
64 putchar(n % 10 + '0');
65 }
66 template <class T>
67 inline void writeln(const T &n)
68 {
69 write(n);
70 puts("");
71 }
72 const ld PI = acos(-1);
73 ld solve(int a, int b, int x)
74 {
75 if (2.0 * x >= a * a * b)
76 return (ld)atan((2 * a * a * b * 1.0 - 2 * x) / (a * a * a * 1.0));
77 return PI / 2 - atan(2 * x * 1.0 / (a * b * b));
78 }
79 int main(int argc, char const *argv[])
80 {
81 #ifndef ONLINE_JUDGE
82 // freopen("in.txt", "r", stdin);
83 // freopen("out.txt", "w", stdout);
84 #endif
85
86 int a, b, x;
87 cin >> a >> b >> x;
88 cout << fixed << setprecision(7) << solve(a, b, x) * 180.0 / PI;
89 return 0;
90 }
E - Gluttony
Description
给出两个长为n的序列A,F以及一个操作数上界k(可以不将操作次数用完),每次操作可以使A序列里的任一个值减一。
操作结束后,将A,F元素两两配对,求配对的最小乘积。
Solution
最近总是碰见这种题。
要求最小乘积,我们肯定得把最小的A和最大的F配对。
对于答案最小乘积而言,如果我们可以得到答案为x,那么一定可以得到一个大于x的答案(减少操作数或者将配对情况交换)
也就是说决策具有单调性。
那么就很显然可以二分来搞。
每次check时将配对乘积大于答案的减去最小的次数,判断最后次数是否小于等于k

1 #include <algorithm>
2 #include <cctype>
3 #include <cmath>
4 #include <cstdio>
5 #include <cstdlib>
6 #include <cstring>
7 #include <iostream>
8 #include <map>
9 #include <numeric>
10 #include <queue>
11 #include <set>
12 #include <stack>
13 #if __cplusplus >= 201103L
14 #include <unordered_map>
15 #include <unordered_set>
16 #endif
17 #include <vector>
18 #define lson rt << 1, l, mid
19 #define rson rt << 1 | 1, mid + 1, r
20 #define LONG_LONG_MAX 9223372036854775807LL
21 #define pblank putchar(' ')
22 #define ll LL
23 #define fastIO ios::sync_with_stdio(false), cin.tie(0), cout.tie(0)
24 using namespace std;
25 typedef long long ll;
26 typedef long double ld;
27 typedef unsigned long long ull;
28 typedef pair<int, int> P;
29 int n, m;
30 ll k;
31 const int maxn = 2e5 + 10;
32 template <class T>
33 inline T read()
34 {
35 int f = 1;
36 T ret = 0;
37 char ch = getchar();
38 while (!isdigit(ch))
39 {
40 if (ch == '-')
41 f = -1;
42 ch = getchar();
43 }
44 while (isdigit(ch))
45 {
46 ret = (ret << 1) + (ret << 3) + ch - '0';
47 ch = getchar();
48 }
49 ret *= f;
50 return ret;
51 }
52 template <class T>
53 inline void write(T n)
54 {
55 if (n < 0)
56 {
57 putchar('-');
58 n = -n;
59 }
60 if (n >= 10)
61 {
62 write(n / 10);
63 }
64 putchar(n % 10 + '0');
65 }
66 template <class T>
67 inline void writeln(const T &n)
68 {
69 write(n);
70 puts("");
71 }
72 ll a[maxn], f[maxn];
73 inline int judge(ll x)
74 {
75 ll cnt = 0;
76 for (int i = 1; i <= n; i++)
77 if (a[i] * f[n - i + 1] > x)
78 {
79 ll tmp = a[i] * f[n - i + 1] - x;
80 cnt += tmp / f[n - i + 1];
81 if (tmp % f[n - i + 1])
82 ++cnt;
83 }
84 return cnt <= k;
85 }
86 int main(int argc, char const *argv[])
87 {
88 #ifndef ONLINE_JUDGE
89 // freopen("in.txt", "r", stdin);
90 // freopen("out.txt", "w", stdout);
91 #endif
92 n = read<int>();
93 k = read<ll>();
94 for (int i = 1; i <= n; i++)
95 a[i] = read<ll>();
96 for (int i = 1; i <= n; i++)
97 f[i] = read<ll>();
98 sort(a + 1, a + 1 + n);
99 sort(f + 1, f + 1 + n);
100 ll l = 0, r = 1e12 + 1;
101 ll res = 0;
102 while (l <= r)
103 {
104 ll mid = l + r >> 1;
105 if (judge(mid))
106 {
107 res = mid;
108 r = mid - 1;
109 }
110 else
111 l = mid + 1;
112 }
113 writeln(res);
114 return 0;
115 }
