루오 구 P2627은 잔디 문제의 해결책을 깎고

P2627은 잔디를 깎고

제목 설명

년 전에 최고의 잔디 게임을 원 마을에서 농장 요한이 지연되었다 잔디를 깎았하지 않습니다. 이제, 최고의 잔디 게임의 새로운 라운드가 시작, 농장 존은 다시 승리를 기대하고있다.

그러나, 농장 존 잔디는 매우 더러운 따라서, 농장 존은 자신의 소는이 작업 수행에하도록 할 수 있습니다. 팜 존 N을 갖는다 (1 <= N = 100,000 <) 행만을 소 1, ... N.을 넘버링 각 소 효율 난 젖소의 효율 E_i이며, 다른 (0 <= E_i <= 1,000,000,000).

소는 잘 알고 닫습니다, 그래서 K 농장 존 준비보다 더에만 연속 소의 경우, 다음 소 : 파업 파티에 갈 것입니다. 그래서 지금 농장 존 헬프 FJ는 최대 효율을 얻을 수 계산해야하고, 프로그램은 연속 K 소를 초과하지 않습니다.

입력 형식

첫번째 라인 : 공간 분리 된 두 정수 N과 K

제 N + 1 라인 : 제 라인 I + 1의 정수를 갖는다 E_i

출력 형식

첫번째 라인 : 최대 효율의 값을 나타내는 값은 농장 존을 얻을 수있다.

샘플 입출력

입력 # 1

5 2
1
2
3
4
5

출력 # 1

(12)

[생각]

DP 큐 선형 모노톤

앞의 [이야기]

매우 흥미로운 질문
이를 위해있는 가장 변수 간격 크기를 선택하는 것입니다
너무 많은 문제를 잘
올바른 질문 머리를하고 싶지?

[접두어] 아이디어

A는 다음 오지되는 반대!
소는 많은 문제를 찾아 선택할 수 있습니다
다음 소를 식별하도록 선택하지 않은
소를 선택하지가 작아야
아니라 다른 범위로하고
두 개의 연속 선정 소가 더 나은 결과를하지 않습니다 거기 때문에
단지 결과는 악화
다중 선택 옵션보다 더 나은 것 때문에
구체적인 증거 말을하지 않습니다
같은 것을 다음의 자신의 감정을 이해

[생각] 마지막

그런 다음 열거 할 첫 번째 점에서 시작
팀을
팀이 거리가 첫번째 팀을 팝업 것입니다 K + 1보다 큰 포인트 첫 번째 경우
왜 + 1을 K로 설정
이 선택되어 있지 않기 때문에 젖소
가장 긴 연속 간격이있다 길이 K가하기
범위 일 것이다 가축의 양측에 선택되지 않은
이 경우에, 거리 K + 1
이 가장 긴 경우와
는 K + 1보다 큰
때문 작은 것을 선택하는
것이 큐 테일보다 큰 또한 팝업 F [I]
로 인해 발생하지 않은 팀의 꼬리 끝보다 작은 값의
나보다 나보다 조금 더 강한!

[주]

큐의 헤드 이상 값의 제 1 범위 팝
하고 F 처리 [I]의 값은
분사 힘의 최종 단부
[I] 최소 법 앞 부분의 값에 따라 F로
불법적 제 절 폭탄 아웃
또는 [I] 합법적 f를 보장 할 수
와 비교의 기준을 팝 F [i]는 크기
공정 F가 끝나기 전에 상기 제 팝업 팀 [I]가 값 있도록
이러한 순서 굉음 나온

[전체 코드]

#include<iostream>
#include<cstdio>
#include<queue>
#define int long long
using namespace std;
const int Max = 100005;
struct node
{
    int t;
    int v;
};
deque<node>q;
int a[Max];
int f[Max];
signed main()
{
    int n,k;
    cin >> n >> k;
    int tot = 0;
    for(register int i = 1;i <= n;++ i)
        cin >> a[i],tot += a[i];
    int M = 0x7f7f7f7f7f7f;
    q.push_back((node){0,0});
    for(register int i = 1;i <= n;++ i)
    {
        while(!q.empty() && i - q.front().t > k + 1)
            q.pop_front();
        f[i] = q.front().v + a[i];
        while(!q.empty() && f[i] < q.back().v)
            q.pop_back();
        q.push_back((node){i,f[i]});
    }
    for(register int i = n;i >= n - k;i --)
        M = min(M,f[i]);
    cout << tot - M << endl;
    return 0;
}

추천

출처www.cnblogs.com/acioi/p/11680772.html