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

posted @ 2023-04-06 15:41  Sakana~  阅读(23)  评论(0编辑  收藏  举报