Submission #3390384


Source Code Expand

import java.util.*;

class Main {
    static long[] bit0,bit1;
    static int[] a;
    static int m,n;
    static int maxN = 100000+100;
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        n = sc.nextInt();
        m = sc.nextInt();
        a = new int[n+1];
        bit0 = new long[100000+100];
        bit1 = new long[100000+100];
        for(int i=1;i<=n;i++) a[i]=sc.nextInt();
        long oriSum = 0;
        for(int i=1;i<n;i++) oriSum += a[i]<a[i+1]?a[i+1]-a[i]:m-a[i]+a[i+1];
        long temp[] = new long[m+1];
        for(int i=1;i<=n-1;i++) {
            handle(a[i],a[i+1]);
        }
        long res = 0;
        for(int j=1;j<=m;j++) temp[j] = sim_sum(j);
        for(int i=1;i<=m;i++) res = Math.max(res,temp[i]);
        System.out.println(oriSum-res);
    }

    static long sum(long[] bit, int i){
        long ans = 0;
        while(i>0){
            ans += bit[i];
            i -= i&(-i);
        }
        return ans;
    }

    static void add(long[] bit, int idx, long val){
        while(idx<=m){
            bit[idx] += val;
            idx += idx&(-idx);
        }
    }

    static long sim_sum(int i){
        return sum(bit1,i)*i+sum(bit0,i);
    }
    // here simulate adding val to all position within the interval [left,right]
    static void sim_add(int left, int right, long val){
        if(left>right){
            return;
        }
        add(bit0,left,-val*(left-1));
        add(bit1,left,val);
        add(bit0,right+1,val*right);
        add(bit1,right+1,-val);
    }

    static void handle(int from, int to){
        if(from<to){
            if(from==to-1) return;
            sim_add(from+2,to,1);
            sim_add(to+1,to+1,-(to-from-1));
        } else if(from > to){
            sim_add(from+2,m,1);
            sim_add(1,1,m-from);
            sim_add(2,to,1);
            sim_add(to+1,to+1,-(m-from+to-1));
        }
    }
}

Submission Info

Submission Time
Task E - guruguru
User AlbertZ
Language Java8 (OpenJDK 1.8.0)
Score 700
Code Size 1998 Byte
Status AC
Exec Time 558 ms
Memory 55124 KB

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 700 / 700
Status
AC × 2
AC × 22
Set Name Test Cases
Sample sample1.txt, sample2.txt
All half0.txt, half1.txt, half2.txt, half3.txt, half4.txt, min_m.txt, min_n.txt, mx0.txt, mx1.txt, mx2.txt, rnd0.txt, rnd1.txt, rnd2.txt, rnd3.txt, rnd4.txt, rnd5.txt, rnd6.txt, rnd7.txt, rnd8.txt, rnd9.txt, sample1.txt, sample2.txt
Case Name Status Exec Time Memory
half0.txt AC 294 ms 48732 KB
half1.txt AC 215 ms 29568 KB
half2.txt AC 361 ms 48988 KB
half3.txt AC 432 ms 45104 KB
half4.txt AC 455 ms 46316 KB
min_m.txt AC 95 ms 20692 KB
min_n.txt AC 117 ms 21844 KB
mx0.txt AC 505 ms 50416 KB
mx1.txt AC 537 ms 48824 KB
mx2.txt AC 558 ms 46952 KB
rnd0.txt AC 100 ms 21844 KB
rnd1.txt AC 98 ms 22612 KB
rnd2.txt AC 163 ms 27788 KB
rnd3.txt AC 263 ms 43692 KB
rnd4.txt AC 381 ms 55124 KB
rnd5.txt AC 152 ms 28760 KB
rnd6.txt AC 94 ms 23380 KB
rnd7.txt AC 151 ms 28552 KB
rnd8.txt AC 182 ms 29284 KB
rnd9.txt AC 108 ms 19924 KB
sample1.txt AC 94 ms 21716 KB
sample2.txt AC 93 ms 22740 KB