BタイトルのWQY

BタイトルのWQY

質問の意味:

そして、タイトルのと呼ばれる機械翻訳がほとんどですが、この質問は困難であるためには、最初のチームを削除する必要がありません。

ソリューション:

ソリューションおよび[POI2005] SAM-おもちゃの車は、この質問はほとんど貪欲と考えられています。
一度各選択における最遠点を使用して除去しました。
うまくヒープメンテナンスしてください。

コード:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>

using namespace std;

#define LL long long
#define N 200010

int n,k,a[N],nxt[N],last[N];
priority_queue<pair<int,int> > q,del;
bool vis[N];

int main() {
    scanf("%d%d",&n,&k);
    for(int i = 1 ; i <= n ; i++) {
        scanf("%d",&a[i]);
        nxt[last[a[i]]] = i;
        last[a[i]] = i;
    }
    for(int i = 1 ; i <= N ; i++) {
        if(last[i]) nxt[last[i]] = n+1;
    }
    int ans = 0,size = 0;
    for(int i = 1 ; i <= n ; i++) {
        if(vis[a[i]]) {
            del.push(make_pair(i,a[i]));
            q.push(make_pair(nxt[i],a[i]));
            continue;
        }
        ans++;
        if(size < k) {
            vis[a[i]] = 1;
            size++;
            q.push(make_pair(nxt[i],a[i]));
        } else {
            while(!q.empty() && !del.empty() && q.top() == del.top()) q.pop(),del.pop();
            int num = q.top().second;
            q.pop();
            vis[num] = 0;
            vis[a[i]] = 1;
            q.push(make_pair(nxt[i],a[i]));
        }
    }
    printf("%d \n",ans);
    //system("pause");
    return 0;
}

おすすめ

転載: www.cnblogs.com/Repulser/p/11409392.html