洛谷 P1638 逛画展(队列,窗口移动

P1638 逛画展
思路:

  1. 这道题我的想法是模拟一个窗口,从左到右移动。
  2. 如果这个窗口里面已经包含了所有画师的画作,那么就记录minn,并且将队首元素pop出去,直到窗口不包含所有画师的画作为止。(这句话好像有歧义。。就是没有包含所有画师的画作时就可以退出循环了
  3. 之后将窗口后面一位的画push进队列。

还有一点需要注意的是用一个整型数据记录窗口中有多少个画师的画作。
完整代码:

#include <iostream>
#include <algorithm>
#include <cstring>
#include <math.h>
#include <functional>
#include <string>
#include <vector>
#include <map>
#include <stack>
#include <cstdio>
#include <deque>
#include <list>
#include <queue>
#include <set>
#include <unordered_map>
#define ll long long


ll n,m;
ll k[1001000];
ll fl[2005];
std::deque<ll> dqe;
ll l,r;
ll minn=1000000000;
int siz=0;


/*
 * 2 5 3 1 3 2 4
 * 5 3 1 3 2 4
 *
 *
 */
int main(){
    std::cin>>n>>m;
    ll i;
    for(i=0;i<n;i++) std::cin>>k[i];
    for(i=0;i<=n;i++){
        while(siz==m) {
            if(dqe.size()<minn) minn=dqe.size(),l=dqe.front(),r=dqe.back();
            fl[k[dqe.front()]]--;
            if(fl[k[dqe.front()]]==0) siz--;
            dqe.pop_front();
        }
        dqe.push_back(i);
        if(fl[k[i]]==0) siz++;
        fl[k[i]]++;
    }
    std::cout<<l+1<<" "<<r+1;
}

带水题!

©️2020 CSDN 皮肤主题: 1024 设计师:上身试试 返回首页