Codeforces :(推奨)(互いに素セット+貪欲)

VKニュース推薦システムは、毎日の1の興味深い出版物nは、ユーザーごとにばらばらなカテゴリを選択します。それぞれの出版物は、1つのカテゴリに属します。各カテゴリのIバッチアルゴリズムの選択のための出版物をaiを。

最新のA / Bテストでは、各カテゴリは、毎日の勧告内の出版物の異なる数を持っている場合、ユーザーはより積極的に推奨される出版物を読んでいることを示唆しています。対象アルゴリズムは、TI秒以内に、i番目のカテゴリーの一つの興味深い出版物を見つけることができます。

すべてのカテゴリは、出版物の別の番号を持っているので、バッチアルゴリズムの実行の結果に出版物を追加するために必要な最小限の合計時間は何ですか?あなたは、バッチアルゴリズムが推奨する出版物を削除することはできません。

入力

入力の最初の行は、単一の整数nから成る - ニュースカテゴリの数(1≤n≤200000)。

入力の2行目は、nは整数で構成されて愛 - バッチアルゴリズム(1≤ai≤109)によって選択されたi番目のカテゴリの出版数。

入力の3行目は、TIから成りnは整数 - それは、カテゴリI(1≤ti≤105)の1つの新しい出版物を見つけるために、対象アルゴリズムの時間を。

出力

対象アルゴリズムは、同じサイズのカテゴリを取り除くために必要最小限の時間 - 1つの整数を出力します。

入力
5
3 7 9 7 8
5 2 5 7 5
の出力
6

入力
5
1 2 3 4 5
1 1 1 1 1
出力
0

同じ時間は、前述の小さな数字があれば、時間に応じて最初の降順は、
デキューのプライオリティキューに投げたかった、秩序構造は、ライン上で直接見られます

そして、互いに素セットのメンテナンス祖先各書籍のラベルは、本は彼の祖先であることを5、6のようなラベル
1E9の範囲内の数字は、初期化されていないので、配列することができないという大きな
ので、使用マップ、マップ[I] = 0が先祖によって表されるI

コード:

#include <bits/stdc++.h>
#define ll long long
using namespace std;
struct qq
{
    ll val,t;
}q[200005];
struct node
{
    ll val,t;
}e[200005];
bool cmp(qq a,qq b)
{
    if(a.t>b.t)
    {return 1;}
    if(a.t==b.t)
    {
        if(a.val<b.val)
        {return 1;}
        return 0;
    }
    return 0;
}
map<ll,ll> Map;
ll getf(ll u)
{
    if(Map[u]==0)
    {return u;}
    else
    {
        Map[u]=getf(Map[u]);
        return Map[u];
    }
}
void query(ll u,ll v)
{
    ll t1,t2;
    t1=getf(u);
    t2=getf(v);
    if(t1!=t2)
    {Map[t2]=t1;}
}
int main()
{
    int n;
    cin>>n;
    for(int i=0;i<n;i++)
    {scanf("%lld",&q[i].val);}
    for(int i=0;i<n;i++)
    {scanf("%lld",&q[i].t);}
    sort(q,q+n,cmp);
    ll ans=0;
    for(int i=0;i<n;i++)
    {
        ll op=q[i].val;
        if(getf(op)==0)
        {
            query(op+1,op);
        }
        else
        {
            ans+=(getf(op)-op)*q[i].t;
            query(getf(op)+1,getf(op));
        }
        //cout<<Map[op]<<endl;
    }
    cout<<ans<<endl;
    return 0;
}

公開された36元の記事 ウォンの賞賛4 ビュー1386

おすすめ

転載: blog.csdn.net/qq_43781431/article/details/104711470