There is also the algorithm O (n). Using the same observations as in the previous answer:
Now consider what happens to the column sums when turning to the left of the second row (e.g., change it with 1,2, ..., N to 2,3, ..., N, 1) each column sum is incremented by 1, excluding one column sum, which is reduced by N-1.
Instead of changing all column sums, we can reduce one column sum by N, and then take the maximum column sum plus 1 to find the new maximum column sums. So we need to update only one column, but not all.
A column that displays the high, can only move left or returned to the column with a total maximum when we iterate possibility of a second line. Candidate columns are those that were a temporary maximum for maximum scans from left to right.
- all amounts calculated for a first selection of the second row (1, 2, ..., N) and store them in an array.
- find the maximum in this array in the scan mode from left to right and note the position of the maximum time.
- in the right-left sum value is now reduced by decreasing N. If the process reaches the maximum column, check whether this number is less than the total maximum - N, in this case, the new maximum column is the overall maximum and it will remain there for the rest of the cycle. If the number is more than the previous high, determined in step 2, the maximum column will remain unchanged for the rest of the cycle. Otherwise, the previous high becomes the new maximum column.
Taking the example of an input 7,1,6,2, the algorithm works as follows: Step 1 calculates the sum of 8,3,9,6 Step 2 finds time maxima from left to right: 8 in column 1 and then 9 in column 3 Step 3 generates results passing through the array from right to left
8 3 9 6 -> output 9 + 0 = 9 8 3 9 2 -> output 9 + 1 = 10 8 3 5 2 -> current max col is decreased, previous max 8 is larger and becomes current output 8 + 2 = 10 8 -1 5 2 -> output 8 + 3 = 11
Here is the algorithm in C:
#include <stdio.h> int N; int A[200000]; int M[200000]; int main(){ int i,m,max,j,mval,mmax; scanf("%d",&N); for(i = 0;i < N; i++){ scanf("%d",&A[i]); A[i] = A[i]+i+1; } m = 0; max = 0; M[0] = 0; for(i = 1;i < N; i++){ if(A[i] > A[max]){ m++; M[m] = i; max = i; } } mval = A[max] - N; mmax = max; for(i = N-1,j = 0;i >=0;i --,j++){ printf("%d ", A[max]+j); A[i] = A[i] - N; if(i == max){ if (A[i] < mval) { max = mmax; } else if(m > 0 && A[i] < A[M[m-1]]){ max = M[m-1]; m--; } } } printf("\n"); return 0; } , mval, mmax; #include <stdio.h> int N; int A[200000]; int M[200000]; int main(){ int i,m,max,j,mval,mmax; scanf("%d",&N); for(i = 0;i < N; i++){ scanf("%d",&A[i]); A[i] = A[i]+i+1; } m = 0; max = 0; M[0] = 0; for(i = 1;i < N; i++){ if(A[i] > A[max]){ m++; M[m] = i; max = i; } } mval = A[max] - N; mmax = max; for(i = N-1,j = 0;i >=0;i --,j++){ printf("%d ", A[max]+j); A[i] = A[i] - N; if(i == max){ if (A[i] < mval) { max = mmax; } else if(m > 0 && A[i] < A[M[m-1]]){ max = M[m-1]; m--; } } } printf("\n"); return 0; } N); #include <stdio.h> int N; int A[200000]; int M[200000]; int main(){ int i,m,max,j,mval,mmax; scanf("%d",&N); for(i = 0;i < N; i++){ scanf("%d",&A[i]); A[i] = A[i]+i+1; } m = 0; max = 0; M[0] = 0; for(i = 1;i < N; i++){ if(A[i] > A[max]){ m++; M[m] = i; max = i; } } mval = A[max] - N; mmax = max; for(i = N-1,j = 0;i >=0;i --,j++){ printf("%d ", A[max]+j); A[i] = A[i] - N; if(i == max){ if (A[i] < mval) { max = mmax; } else if(m > 0 && A[i] < A[M[m-1]]){ max = M[m-1]; m--; } } } printf("\n"); return 0; } { #include <stdio.h> int N; int A[200000]; int M[200000]; int main(){ int i,m,max,j,mval,mmax; scanf("%d",&N); for(i = 0;i < N; i++){ scanf("%d",&A[i]); A[i] = A[i]+i+1; } m = 0; max = 0; M[0] = 0; for(i = 1;i < N; i++){ if(A[i] > A[max]){ m++; M[m] = i; max = i; } } mval = A[max] - N; mmax = max; for(i = N-1,j = 0;i >=0;i --,j++){ printf("%d ", A[max]+j); A[i] = A[i] - N; if(i == max){ if (A[i] < mval) { max = mmax; } else if(m > 0 && A[i] < A[M[m-1]]){ max = M[m-1]; m--; } } } printf("\n"); return 0; } A [i]); #include <stdio.h> int N; int A[200000]; int M[200000]; int main(){ int i,m,max,j,mval,mmax; scanf("%d",&N); for(i = 0;i < N; i++){ scanf("%d",&A[i]); A[i] = A[i]+i+1; } m = 0; max = 0; M[0] = 0; for(i = 1;i < N; i++){ if(A[i] > A[max]){ m++; M[m] = i; max = i; } } mval = A[max] - N; mmax = max; for(i = N-1,j = 0;i >=0;i --,j++){ printf("%d ", A[max]+j); A[i] = A[i] - N; if(i == max){ if (A[i] < mval) { max = mmax; } else if(m > 0 && A[i] < A[M[m-1]]){ max = M[m-1]; m--; } } } printf("\n"); return 0; } [max]) { #include <stdio.h> int N; int A[200000]; int M[200000]; int main(){ int i,m,max,j,mval,mmax; scanf("%d",&N); for(i = 0;i < N; i++){ scanf("%d",&A[i]); A[i] = A[i]+i+1; } m = 0; max = 0; M[0] = 0; for(i = 1;i < N; i++){ if(A[i] > A[max]){ m++; M[m] = i; max = i; } } mval = A[max] - N; mmax = max; for(i = N-1,j = 0;i >=0;i --,j++){ printf("%d ", A[max]+j); A[i] = A[i] - N; if(i == max){ if (A[i] < mval) { max = mmax; } else if(m > 0 && A[i] < A[M[m-1]]){ max = M[m-1]; m--; } } } printf("\n"); return 0; } ; #include <stdio.h> int N; int A[200000]; int M[200000]; int main(){ int i,m,max,j,mval,mmax; scanf("%d",&N); for(i = 0;i < N; i++){ scanf("%d",&A[i]); A[i] = A[i]+i+1; } m = 0; max = 0; M[0] = 0; for(i = 1;i < N; i++){ if(A[i] > A[max]){ m++; M[m] = i; max = i; } } mval = A[max] - N; mmax = max; for(i = N-1,j = 0;i >=0;i --,j++){ printf("%d ", A[max]+j); A[i] = A[i] - N; if(i == max){ if (A[i] < mval) { max = mmax; } else if(m > 0 && A[i] < A[M[m-1]]){ max = M[m-1]; m--; } } } printf("\n"); return 0; } [max] + j); #include <stdio.h> int N; int A[200000]; int M[200000]; int main(){ int i,m,max,j,mval,mmax; scanf("%d",&N); for(i = 0;i < N; i++){ scanf("%d",&A[i]); A[i] = A[i]+i+1; } m = 0; max = 0; M[0] = 0; for(i = 1;i < N; i++){ if(A[i] > A[max]){ m++; M[m] = i; max = i; } } mval = A[max] - N; mmax = max; for(i = N-1,j = 0;i >=0;i --,j++){ printf("%d ", A[max]+j); A[i] = A[i] - N; if(i == max){ if (A[i] < mval) { max = mmax; } else if(m > 0 && A[i] < A[M[m-1]]){ max = M[m-1]; m--; } } } printf("\n"); return 0; } ) { #include <stdio.h> int N; int A[200000]; int M[200000]; int main(){ int i,m,max,j,mval,mmax; scanf("%d",&N); for(i = 0;i < N; i++){ scanf("%d",&A[i]); A[i] = A[i]+i+1; } m = 0; max = 0; M[0] = 0; for(i = 1;i < N; i++){ if(A[i] > A[max]){ m++; M[m] = i; max = i; } } mval = A[max] - N; mmax = max; for(i = N-1,j = 0;i >=0;i --,j++){ printf("%d ", A[max]+j); A[i] = A[i] - N; if(i == max){ if (A[i] < mval) { max = mmax; } else if(m > 0 && A[i] < A[M[m-1]]){ max = M[m-1]; m--; } } } printf("\n"); return 0; } M [m- #include <stdio.h> int N; int A[200000]; int M[200000]; int main(){ int i,m,max,j,mval,mmax; scanf("%d",&N); for(i = 0;i < N; i++){ scanf("%d",&A[i]); A[i] = A[i]+i+1; } m = 0; max = 0; M[0] = 0; for(i = 1;i < N; i++){ if(A[i] > A[max]){ m++; M[m] = i; max = i; } } mval = A[max] - N; mmax = max; for(i = N-1,j = 0;i >=0;i --,j++){ printf("%d ", A[max]+j); A[i] = A[i] - N; if(i == max){ if (A[i] < mval) { max = mmax; } else if(m > 0 && A[i] < A[M[m-1]]){ max = M[m-1]; m--; } } } printf("\n"); return 0; }