단조 로 운 대열

9064 단어 알고리즘 잡기
단조 로 운 대기 열 은 대기 열 을 유지 하 는 사상 입 니 다. 사실 단조 로 운 대기 열 은 하나의 대기 열 을 유지 하 는 것 입 니 다. 이 대기 열 구간 이 가장 크 거나 구간 이 가장 작 습 니 다.
예제:
박람 관 에 서 는 세계 최고의 M 명의 화가 가 그린 그림 이 전시 되 고 있다.
wangjy 는 박람 관 에 가서 이 대사 들 의 작품 을 보고 싶 어 합 니 다.
그러나 그곳 의 박람 관 에는 이상 한 규정 이 있 는데 그것 이 바로 입장권 을 구 매 할 때 반드시 두 개의 숫자 를 설명해 야 한 다 는 것 이다. a 와 b 는 그 가 전시회 중의 a 폭 에서 b 그림 (a 와 b 포함) 사이 의 모든 그림 을 보 려 고 하 는 것 을 대표 하고 입장권 의 가격 은 한 장의 그림 1 원 이다.
더 많은 명사 의 그림 을 보기 위해 왕 지 이 는 입장 후 모든 명사 의 그림 (적어도 한 장 씩) 을 볼 수 있 기 를 희망 한다.
하지만 그 는 또 돈 을 아 끼 고 싶 어한 다.
wangjy 의 친구 로 서 그 는 그 가 입장권 을 구 매 할 때의 a 값 과 b 값 을 결정 하 는 프로그램 을 써 달라 고 부탁 했다.
입력 형식 첫 줄 에는 두 개의 정수 N 과 M 이 포함 되 어 있 으 며 그림 총수 와 화가 수 를 표시 합 니 다.
두 번 째 줄 은 N 개의 정 수 를 포함 하 는데 모두 1 과 M 사이 에 있 고 그림 작가 의 번 호 를 대표 한다.
출력 형식 은 두 개의 정수 a 와 b 를 출력 합 니 다.
데 이 터 는 해 가 있 음 을 보증 합 니 다. 여러 개의 해 가 존재 하면 a 의 가장 작은 해 를 출력 합 니 다.
데이터 범위 1 ≤ N ≤ 106, 1 ≤ M ≤ 2000 입력 샘플: 12 5 2 5 3 1 3 2 4 1 5 4 3 출력 샘플: 2 7
#include 
#include 
#include 
#include
#include
#include
using namespace std;
const int N = 1e6+50;
int arr[N];
int a[N]={0};
deque<int> dq;




int main()
{
    int n,m;
    cin>>n>>m;
    int begin,end ,cha = 1e6+5;
    for(int i=1 ;i<=n;i++)
    {
        cin>>arr[i];
    }
    int cnt = 0 ;
    for(int i =1 ; i <=n;i++)
    {
        if(!a[arr[i]])
            cnt++;
        a[arr[i]]++;
        dq.push_back(i);
        while(a[arr[dq.front()]]>1)//               
        {
            a[arr[dq.front()]]--;
            dq.pop_front();
        }
        
        if(cnt == m&&(dq.end()-dq.begin())<cha)
                   {
                       begin = dq.front();
                       end = dq.back();
                       cha = end - begin ;
                  
                   }
    }
    cout<<begin<<" "<<end;
}


단조 로 운 대열

좋은 웹페이지 즐겨찾기