AtCoder Beginner Contest 155
AtCoder Beginner Contest 155
https://atcoder.jp/contests/abc155
D - Pairs
这个二分好难写,疯狂WA,QAQ
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 2e5 + 5;
ll a[N], b[N], n, k;
bool check (ll x) {
ll cnt = 0; //比x小的有cnt个
//先找正的
for (int i = 1; i <= n; i++) {
if (a[i] >= 0) {
int l = 1, r = n, ans = 0;
while (l <= r) {
int mid = (l + r) / 2;
if (a[mid] * a[i] < x) l = mid + 1, ans = mid;
else r = mid - 1;
}
if (ans >= i) cnt += ans - 1; //除去自身
else cnt += ans;
}
else {
int l = 1, r = n, ans = 0;
while (l <= r) {
int mid = l + r + 1 >> 1;
if (b[mid] * a[i] < x) ans = mid, l = mid + 1;
else r = mid - 1;
}
if (ans >= n - i + 1) cnt += ans - 1;
else cnt += ans;
}
}
return cnt / 2 >= k;
}
int main () {
cin >> n >> k;
for (int i = 1; i <= n; i++) cin >> a[i], b[i] = a[i];
sort (a + 1, a + n + 1), sort (b + 1, b + n + 1, greater<>());
ll l = -1e18, r = 1e18;
while (l <= r) {
ll mid = (l + r) / 2;
if (check (mid)) r = mid - 1;
else l = mid + 1;
}
cout << r << endl; //r符合条件,再看看能不能被凑出来
}
//一眼二分,鉴定为
//第k大
//
E - Payment
线性dp。推了好久转移,其实挺一眼的。
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 1e6 + 5;
string s;
ll ans = 1e18;
ll f[N][2]; //往上取一位or当前位
int main () {
cin >> s;
//多一位
int n = s.size ();
//reverse (s.begin (), s.end ());
s = '0' + s;
//memset (f, 0x3f, sizeof f);
f[0][0] = 0, f[0][1] = 1;
for (int i = 1; i <= n; i++) {
int num = s[i] - '0'; //填下一位
f[i][0] = min (f[i-1][0] + num, f[i-1][1] + 10 - num);
f[i][1] = min (f[i-1][0] + num + 1, f[i-1][1] + 10 - num - 1);
}
cout << f[n][0];
}
F - Perils in Parallel
树形dp
没看懂题解qaq