Submission #209417

#TimeUsernameProblemLanguageResultExecution timeMemory
209417model_codeMountains (NOI20_mountains)Java
100 / 100
1598 ms33536 KiB
import java.io.DataInputStream;
import java.io.IOException;
import java.util.*;
import java.io.*;
class Fenwick{
  private int data_[];
  public int query(int index){
    int ret=0;
    for(;index>0;index-=(index&-index)){
      ret+=data_[index];
    }
    return ret;
  }
  public void update(int index){
    for(++index;index<data_.length;index+=(index&-index)){
      ++data_[index];
    }
  }
  public Fenwick(int n){
    data_=new int[n+1];
  }
}
class Element{
  long height;
  int index;
}
public class Mountains {
    static class Reader {
        final private int BUFFER_SIZE = 1 << 16;
        private DataInputStream din;
        private byte[] buffer;
        private int bufferPointer, bytesRead;
        public Reader() {
            din = new DataInputStream(System.in);
            buffer = new byte[BUFFER_SIZE];
            bufferPointer = bytesRead = 0;
        }
        public int nextInt() throws IOException {
            int ret = 0;
            byte c = read();
            while (c <= ' ') {
                c = read();
            }
            do {
                ret = ret * 10 + c - '0';
            } while ((c = read()) >= '0' && c <= '9');
            return ret;
        }
        public long nextLong() throws IOException {
            long ret = 0;
            byte c = read();
            while (c <= ' ') {
                c = read();
            }
            do {
                ret = ret * 10 + c - '0';
            } while ((c = read()) >= '0' && c <= '9');
            return ret;
        }

        private void fillBuffer() throws IOException
        {
            bytesRead = din.read(buffer, bufferPointer = 0, BUFFER_SIZE);
            if (bytesRead == -1) {
                buffer[0] = -1;
            }
        }

        private byte read() throws IOException
        {
            if (bufferPointer == bytesRead) {
                fillBuffer();
            }
            return buffer[bufferPointer++];
        }
    }

    public static void main(String[] args) throws IOException {
        Reader reader = new Reader();
        int n = reader.nextInt();
        Fenwick fw=new Fenwick(n);
        Element[] arr = new Element[n];
        for(int i=0;i<n;++i){
          Element el = arr[i] = new Element();
          el.height = reader.nextLong();
          el.index = i;
        }
        Arrays.sort(arr, (x,y) -> Long.compare(x.height,y.height));
        long ans=0;
        for(int i=0;i<n;){
          final long val=arr[i].height;
          int j;
          for(j=i;j<n&&arr[j].height==val;++j){
            final int idx=arr[j].index;
            final int tmp=fw.query(idx);
            ans+=tmp*(long)(i-tmp);
          }
          for(;i<j;++i){
            final int idx=arr[i].index;
            fw.update(idx);
          }
        }
        System.out.println(ans);
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...