Submission #3390377


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]);
            for(int j=1;j<=m;j++) temp[j] = sim_sum(j);
        }
        long res = 0;

        //for(int i=1;i<=m;i++) temp[i] = sim_sum(i);
        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 0
Code Size 2059 Byte
Status TLE
Exec Time 2109 ms
Memory 49060 KB

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 0 / 700
Status
AC × 2
AC × 13
TLE × 9
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 TLE 2109 ms 42332 KB
half1.txt TLE 2108 ms 29680 KB
half2.txt TLE 2109 ms 46560 KB
half3.txt TLE 2109 ms 47500 KB
half4.txt TLE 2109 ms 46948 KB
min_m.txt AC 95 ms 21204 KB
min_n.txt AC 106 ms 23764 KB
mx0.txt TLE 2109 ms 46864 KB
mx1.txt TLE 2108 ms 49060 KB
mx2.txt TLE 2109 ms 48964 KB
rnd0.txt AC 117 ms 20948 KB
rnd1.txt AC 99 ms 22612 KB
rnd2.txt AC 1108 ms 27668 KB
rnd3.txt TLE 2109 ms 46844 KB
rnd4.txt AC 751 ms 46476 KB
rnd5.txt AC 153 ms 25944 KB
rnd6.txt AC 95 ms 25428 KB
rnd7.txt AC 608 ms 25132 KB
rnd8.txt AC 788 ms 32992 KB
rnd9.txt AC 100 ms 23636 KB
sample1.txt AC 93 ms 22740 KB
sample2.txt AC 95 ms 24788 KB