Luogu P3620 [APIO / CTSC 2007] 데이터 백업

주제
볼록 최적화 플레이어 다시 약간.
분명히 우리는 선택 \ (케이 \) 에 인접한 한 쌍을, 그래서 우리는 선거 후 제목의 차동 의미로 변환 할 수 있습니다 \ (케이 \) 인접하지 않은 번호와 최소를합니다.
우리는 욕심을 고려 : 모든 선거는 최소. 오류의 탐욕스러운 성격은 분명하다.
우리는 돌아 가야하는 메커니즘을 추가 :
숫자의 제거 \ (A \) 그 후, 우리는 옆에 두 개의 숫자를 넣어 (C \, B) \ 제거,이 위치에 새 번호를 넣어 \ (B + CA \) .
그런 다음 우리는 목록의 유지 보수 옆에 최소 수를 유지하고, 위치의 레코드 수는 삭제 될 경우 다음 배럴을 열 스택을 사용합니다.
그것의 욕심 정확성을 이해하는 방법 : 현재의 최소 포인트를 선택하지 않으면, 당신은 그것을 옆에 두 점을 선택한다.
그냥 자신을 이해할 수있을 것입니다 생각.

#include<bits/stdc++.h>
using namespace std;
const int N=100007,inf=0x3f3f3f3f;
struct node{int v,p;}t;
int operator<(node a,node b){return a.v>b.v;}
int f[N],l[N],r[N],v[N];
priority_queue<node>q;
void del(int x){l[x]=l[l[x]],r[x]=r[r[x]],r[l[x]]=x,l[r[x]]=x;}
int read(){int x;scanf("%d",&x);return x;}
int main()
{
    int n=read(),m=read(),i,ans=0,p;
    for(i=0;i<n;++i) v[i]=read();
    for(i=n-1;i;--i) v[i]-=v[i-1],l[i]=i-1,r[i]=i+1,q.push((node){v[i],i});
    v[0]=v[n]=inf;
    for(i=1;i<=m;++i)
    {
    while(f[q.top().p]) q.pop();
    t=q.top(),q.pop(),p=t.p,ans+=t.v,f[l[p]]=f[r[p]]=1,v[p]=v[l[p]]+v[r[p]]-v[p],q.push((node){v[p],p}),del(p);
    }
    return !printf("%d",ans);
}

추천

출처www.cnblogs.com/cjoierShiina-Mashiro/p/11580347.html