AtCoder Beginner Contest 338 --- D - Island Tour -- 题解

D - Island Tour

题目大意

AtCoder Beginner Contest 338 --- D - Island Tour -- 题解_第1张图片AtCoder Beginner Contest 338 --- D - Island Tour -- 题解_第2张图片

思路解析:

        

AtCoder Beginner Contest 338 --- D - Island Tour -- 题解_第3张图片

可以发现 1->2->4 整体减1变为5->1->3,

        其中2->4的距离等于1->3的距离

        其中1->2的距离不等于5->1的距离,则只有当[xj - i] <= 0后的xj - > xj+1 和 xj -> xj-1的距离才会发生改变。所有我们枚举当前需要整体减去i,然后看哪些点会小于等于0,又因为我们可以每次记录上一次i-1的答案,所以我们只需要统计哪些点减i会等于0引起的距离变化。

        如果我们通过记录哪些点等于i,可以减少统计答案时,遍历哪些点等于i的过程。

代码实现:        

import java.io.*;
import java.math.BigInteger;
import java.util.*;


public class Main {
    public static void main(String[] args) throws IOException {
        int n = input.nextInt();
        int m = input.nextInt();
        Vector[] arr = new Vector[200001];
        for (int i = 0; i < 200001; i++) {
            arr[i] = new Vector();
        }
        int[] x = new int[m];
        long ans = 0;
        for (int i = 0; i < m; i++) {
            x[i] = input.nextInt();
            if (i != 0)
                ans += Math.abs(x[i] - x[i - 1]);
            arr[x[i]].add(i);
        }
        long res = ans;
        for (int i = 1; i <= n - 1; i++) {
            for (int t = 0; t < arr[i].size(); t++) {
                int j = arr[i].get(t);
                if (j >= 1){
                    int k = (x[j - 1] - i + n) % n;
                    ans += Math.abs(n - k) - k;
                }
                if (j < m - 1){
                    int k = (x[j + 1] - i + n) % n;
                    ans += Math.abs(n - k) - k;
                }
            }
            res = Math.min(ans, res);
        }
        out.println(res);
        out.flush();
        out.close();
        br.close();
    }


    static PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
    static Input input = new Input(System.in);
    static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

    static class Input {
        public BufferedReader reader;
        public StringTokenizer tokenizer;

        public Input(InputStream stream) {
            reader = new BufferedReader(new InputStreamReader(stream), 32768);
            tokenizer = null;
        }

        public String next() {
            while (tokenizer == null || !tokenizer.hasMoreTokens()) {
                try {
                    tokenizer = new StringTokenizer(reader.readLine());
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
            }
            return tokenizer.nextToken();
        }

        public String nextLine() {
            String str = null;
            try {
                str = reader.readLine();
            } catch (IOException e) {
                // TODO 自动生成的 catch 块
                e.printStackTrace();
            }
            return str;
        }

        public int nextInt() {
            return Integer.parseInt(next());
        }

        public long nextLong() {
            return Long.parseLong(next());
        }

        public Double nextDouble() {
            return Double.parseDouble(next());
        }

        public BigInteger nextBigInteger() {
            return new BigInteger(next());
        }
    }

}

你可能感兴趣的:(linux,运维,服务器)