문제에 대한 해결 방법 [JOI 2019 최종] 동전 수집

얼굴 질문

결심

첫째, 제목 상자에 어떤 시점으로 해석 될 수 있으며, 각 격자 만 넣을 수 있습니다.

그리고 분명히 당신은 그리드의 가장 가까운 상자에이 점을 넣을 수 있습니다,

(이 시간은 그리드는 더 많이 넣을 수 있습니다)

그런 다음 상자에실행에 대한운동.

그럼 하나의 라인을 살펴 보자,

이 동전에서 단지 좌우로 이동할 수 있습니다.

따라서 배열 시작할 수있다 ([I]가 \ F) \ 이 여러 동전을 갖는 격자를 기록.

그러나 차이가 있다는 것입니다 욕조의 초기 값 \ (- 1 \) .

즉 격자의 값에 동전을 넣어 것은 \ (0 \) .

그런 다음에서 \ (1 \) 받는 사람 \ (N- \) 통과,

만약 \ (F [I] <0 \) 는 주화의 오른쪽 위로 이동하는 데 필요한,

그리고 \ (F [I]는> 0 \) 경화가 오른쪽으로 이동하는 것으로 설명하기로한다.

이어서 \ (F는 [I가 +. 1] + = F [I] \) ,이 나타내는 수요 확산 다음,

그리고 \ (ANS = F + [I] \) 때문에 \ ([I]가 \ F) 격자의 주화 이동.

(상기 단락 바람직 재평가 함께 어느 판독)

그런 다음 두 줄이 다음보다 하나 아래로 움직이다,있다,

수직 운동은 좌우 이동보다 더 나쁘다입니다.

그래서 위아래로 이동할 수 있습니다 고려, 다음 줄에 옮겼다.

암호:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <set>
#include <algorithm>
#define int long long
#define pii pair<int,int>
#define fi first
#define sc second
#define fre(x) freopen(x".in","r",stdin),freopen(x".out","w",stdout)
using namespace std;

inline int read(){
    int sum=0,f=1;char ch=getchar();
    while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){sum=sum*10+ch-'0';ch=getchar();}
    return f*sum;
}

const int N=1000005;
struct node{int x,y;}a[N];
int n,tot,ans;
int f[N][3];

signed main(){
    n=read();
    for(int i=1;i<=(n<<1);i++) a[i].x=read(),a[i].y=read();
    for(int i=1;i<=n;i++) f[i][1]=f[i][2]=-1;
    for(int i=1;i<=(n<<1);i++){
        int xx=max((int)1,min(a[i].x,n)),yy=max((int)1,min(a[i].y,(int)2));
        ans+=abs(xx-a[i].x)+abs(yy-a[i].y);
        f[xx][yy]++;
    }
    for(int i=1;i<=n;i++){
        if(f[i][1]>0&&f[i][2]<0){
            int ret=min(abs(f[i][1]),abs(f[i][2]));
            f[i][1]-=ret;f[i][2]+=ret;
            ans+=ret;
        }
        else if(f[i][1]<0&&f[i][2]>0){
            int ret=min(abs(f[i][1]),abs(f[i][2]));
            f[i][2]-=ret;f[i][1]+=ret;
            ans+=ret;
        }
        ans+=abs(f[i][1]+f[i][2]);
        f[i+1][1]+=f[i][1];f[i+1][2]+=f[i][2];
    }
    printf("%lld\n",ans);
    return 0;
}

추천

출처www.cnblogs.com/zsq259/p/11743722.html