二分答案

最近失智了


更:我是zz,写出了模拟怀疑复杂度没冲

模拟:


#include <algorithm>
#include <bitset>
#include <map>
#include <vector>
#include <string>
#include <cstring>
#include <iostream>
#include <cmath>
#include <stack>
#include <set>
#include <queue>
/*
#include<ext/pb_ds/assoc_container.hpp>
#include<ext/pb_ds/hash_policy.hpp>
*/
using namespace std;

const double eps = 1e-10;
const double pi = 3.1415926535897932384626433832795;
const double eln = 2.718281828459045235360287471352;

#define f(i, a, b) for (int i = a; i <= b; i++)
#define LL long long
#define IN freopen("in.txt", "r", stdin)
#define OUT freopen("out.txt", "w", stdout)
#define scan(x) scanf("%d", &x)
#define mp make_pair
#define pb push_back
#define sqr(x) (x) * (x)
#define pr1(x) printf("Case %d: ", x)
#define pn1(x) printf("Case %d:\n", x)
#define pr2(x) printf("Case #%d: ", x)
#define pn2(x) printf("Case #%d:\n", x)
#define lowbit(x) (x & (-x))

#define fi first
#define se second
#define sz(x) int((x).size())
#define all(x) x.begin(), x.end()
#define rall(x) x.rbegin(), x.rend()
#define summ(a) (accumulate(all(a), 0ll))

typedef unsigned long long ull;
typedef pair<int, int> pii;
typedef vector<int> vi;

LL tt, n, m;

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cin >> tt;
    f(sb, 1, tt)
    {
        cin >> n >> m;
        vector v(n, 0);
        for (int i = 1, x; i <= m; ++i)
        {
            cin >> x;
            v[x - 1] += 1;
        }
        sort(all(v));
        multiset<int> s;
        for (auto it : v)
            s.insert(it);
        while (*(prev(s.end())) - *s.begin() >= 3)
        {
            auto mi = *s.begin(), ma=*(prev(s.end()));
            s.erase(s.begin());
            s.erase(prev(s.end()));
            ma-=1,mi+=2;
            s.insert(ma);
            s.insert(mi);
        }
        cout<<*(prev(s.end()))<<"\n";
    }
    return 0;
}

二分:

#include <algorithm>
#include <bitset>
#include <map>
#include <vector>
#include <string>
#include <cstring>
#include <iostream>
#include <cmath>
#include <stack>
#include <set>
#include <queue>
/*
#include<ext/pb_ds/assoc_container.hpp>
#include<ext/pb_ds/hash_policy.hpp>
*/
using namespace std;

const double eps = 1e-10;
const double pi = 3.1415926535897932384626433832795;
const double eln = 2.718281828459045235360287471352;

#define f(i, a, b) for (int i = a; i <= b; i++)
#define LL long long
#define IN freopen("in.txt", "r", stdin)
#define OUT freopen("out.txt", "w", stdout)
#define scan(x) scanf("%d", &x)
#define mp make_pair
#define pb push_back
#define sqr(x) (x) * (x)
#define pr1(x) printf("Case %d: ", x)
#define pn1(x) printf("Case %d:\n", x)
#define pr2(x) printf("Case #%d: ", x)
#define pn2(x) printf("Case #%d:\n", x)
#define lowbit(x) (x & (-x))

#define fi first
#define se second
#define sz(x) int((x).size())
#define all(x) x.begin(), x.end()
#define rall(x) x.rbegin(), x.rend()
#define summ(a) (accumulate(all(a), 0ll))

typedef unsigned long long ull;
typedef pair<int, int> pii;
typedef vector<int> vi;

LL tt, n, m;

struct Node
{
    int a,b;
    bool operator<(const Node &bb){
        return a+b*2<bb.a+bb.b*2;
    }
};


int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cin >> tt;
    f(sb, 1, tt)
    {
        cin >> n >> m;
        vector v(n, 0);
        for (int i = 1, x; i <= m; ++i)
        {
            cin >> x;
            v[x - 1] += 1;
        }
        LL l=1,r=m;
        auto ck=[&](int x){
            LL res=0;
            for(auto &it:v){
                if(it>x)res+=it-x;
                else res-=(x-it)/2;
            }
            return res<=0;
        };

        while(l<r){
            int mid=(l+r)>>1;
            if(ck(mid))r=mid;
            else l=mid+1;
        }
        cout<<r<<"\n";
    }
    return 0;
}
此文章已被阅读次数:正在加载...更新于