Solution getting TLE in java
Разница между en1 и en2, 170 символ(ов) изменены
[Problem Link](https://codeforces.me/problemset/problem/1322/B)↵
~~~~~↵
//  package Quarantine;↵

import java.io.*;↵
import java.util.Arrays;↵
import java.util.StringTokenizer;↵

public class Present {↵
    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 Reader(String file_name) throws IOException↵
        {↵
            din = new DataInputStream(new FileInputStream(file_name));↵
            buffer = new byte[BUFFER_SIZE];↵
            bufferPointer = bytesRead = 0;↵
        }↵

        public String readLine() throws IOException↵
        {↵
            byte[] buf = new byte[64]; // line length↵
            int cnt = 0, c;↵
            while ((c = read()) != -1)↵
            {↵
                if (c == '\n')↵
                    break;↵
                buf[cnt++] = (byte) c;↵
            }↵
            return new String(buf, 0, cnt);↵
        }↵

        public int nextInt() throws IOException↵
        {↵
            int ret = 0;↵
            byte c = read();↵
            while (c <= ' ')↵
                c = read();↵
            boolean neg = (c == '-');↵
            if (neg)↵
                c = read();↵
            do↵
            {↵
                ret = ret * 10 + c - '0';↵
            }  while ((c = read()) >= '0' && c <= '9');↵

            if (neg)↵
                return -ret;↵
            return ret;↵
        }↵

        public long nextLong() throws IOException↵
        {↵
            long ret = 0;↵
            byte c = read();↵
            while (c <= ' ')↵
                c = read();↵
            boolean neg = (c == '-');↵
            if (neg)↵
                c = read();↵
            do {↵
                ret = ret * 10 + c - '0';↵
            }↵
            while ((c = read()) >= '0' && c <= '9');↵
            if (neg)↵
                return -ret;↵
            return ret;↵
        }↵

        public double nextDouble() throws IOException↵
        {↵
            double ret = 0, div = 1;↵
            byte c = read();↵
            while (c <= ' ')↵
                c = read();↵
            boolean neg = (c == '-');↵
            if (neg)↵
                c = read();↵

            do {↵
                ret = ret * 10 + c - '0';↵
            }↵
            while ((c = read()) >= '0' && c <= '9');↵

            if (c == '.')↵
            {↵
                while ((c = read()) >= '0' && c <= '9')↵
                {↵
                    ret += (c - '0') / (div *= 10);↵
                }↵
            }↵

            if (neg)↵
                return -ret;↵
            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 void close() throws IOException↵
        {↵
            if (din == null)↵
                return;↵
            din.close();↵
        }↵
    }↵
    public static void main(String[] args)throws IOException {↵
        Reader s=new Reader();↵
        int n=s.nextInt();↵
        int a[]=new int[n+1];↵
        for(int i=1;i<=n;i++){↵
            a[i]=s.nextInt();↵
        }↵
        int ans=0;↵
        for(int i=0;i<=25;i++){↵
            int b[]=getArray(a,i);↵
            Arrays.sort(b);↵
            long count=getCount(b,n,i);↵
            if(count%2!=0){↵
                ans|=1<<i;↵
            }↵
        }↵
        System.out.println(ans);↵
    }↵
    public static int[] getArray(int a[],int k){↵
        int b[]=new int[a.length];↵
        int t=1<<(k+1);↵
        for(int i=1;i<a.length;i++){↵
            b[i]=a[i]%t;↵
        }↵
        return b;↵
    }↵
    public static long getCount(int b[],int n,int k){↵
        long ans=0;↵
        int left1=1<<k;↵
        int right1=1<<(k+1);↵
        int left2=(1 << k) + (1 << (k + 1));↵
        int right2=1 << (k + 2) - 1;↵
        int x=n+1;↵
        for(int i=1;i<=n;i++){↵
            int rc=getInd(b,i,n,left1);↵
            if(rc==x){↵
                continue;↵
            }↵
            int lc=getInd(b,i,n,right1);↵
            ans+=lc-rc;↵
            if(k!=0) {↵
                rc = getInd(b, i, n, left2);↵
                if(rc==x){↵
                    continue;↵
                }↵
                lc = getInd(b, i, n, right2);↵
                ans += lc - rc;↵
            }↵
        }↵
        return ans;↵
    }↵
    public static int getInd(int a[],int ind,int n,int reqd){↵
        int num=a[ind];↵
        int low=ind+1;↵
        int high=n;↵
        int ans=n+1;↵
        while(low<=high){↵
            int mid=(low+high)/2;↵
            if(a[mid]+num>=reqd){↵
                ans=mid;↵
                
high=mid-1;↵
            }↵
            else{↵
                low=mid+1;↵
            }↵
        }↵
        return ans;↵
    }↵
}↵

~~~~~↵

История

 
 
 
 
Правки
 
 
  Rev. Язык Кто Когда Δ Комментарий
en2 Английский SLIMSHADYNICK 2020-06-28 16:35:41 170
en1 Английский SLIMSHADYNICK 2020-06-28 16:34:39 5390 Initial revision (published)