anasretdinov

Фка того что терзает меня

May 3rd, 2020
383
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. import java.util.*;
  2.  
  3. public class Main {
  4.     static Scanner s = new Scanner(System.in);
  5.     static int len(int k){
  6.         int c = 0;
  7.         while (k > 0){
  8.             c++;
  9.             k /= 10;
  10.         }
  11.         return c;
  12.     }
  13.     static int gcd(int a, int b){
  14.         if (a > b) {
  15.             int t = a + b;
  16.             a = t - a;
  17.             b = t - b;
  18.         }
  19.         if (a == 0) return b;
  20.         if (a == 1) return 1;
  21.         return gcd(a, b % a);
  22.     }
  23.     static void solve(){
  24.         int n = s.nextInt();
  25.     }
  26.  
  27.     static class ModSet{
  28.         long [] a;
  29.         TreeSet<Pair> set;
  30.         TreeSet<Integer> active = new TreeSet<>();
  31.         ModSet(int n){
  32.             a = new long [n+1];
  33.             set = new TreeSet<>();
  34.         }
  35.         void add(long x, int y){
  36.             a[y] = x;
  37.             active.add(y);
  38.             set.add(new Pair(x, y));
  39.         }
  40.         void update(int y, long k){
  41.             Pair d = new Pair(a[y], y);
  42.             set.remove(d);
  43.             a[y] = k;
  44.             d.first = k;
  45.             set.add(d);
  46.         }
  47.         Pair first(){
  48.             Pair p = set.first();
  49.             set.remove(p);
  50.             active.remove(p.second);
  51.             return p;
  52.         }
  53.         int ceeling(int x){
  54.             return active.higher(x);
  55.         }
  56.         long num(int x){
  57.             return a[x];
  58.         }
  59.     }
  60.     public static void main(String[] args) {
  61.         Scanner s = new Scanner(System.in);
  62.         int tc = s.nextInt();
  63.         for (int bgb = 0; bgb < tc; bgb++) {
  64.             int n = s.nextInt();
  65.             int [] a = new int [n+1];
  66.             for (int i = 0; i < n; i++) {
  67.                 a[i+1] = s.nextInt();
  68.             }
  69.             int [] pref = prefsumma(a);
  70.             int [] v = new int [n+1];
  71.             for (int i = n-1; i > -1; i--) {
  72.                 v[i] = v[i+1] + a[i+1];
  73.             }
  74.             ModSet set = new ModSet(n);
  75.             int [] interested = new int [n+1];
  76.             int [] used = new int [n+1];
  77.             long sum = 0;
  78.             long k;
  79.             for (int i = 1; i <= n; i++) {
  80.                 interested[i] = 1;
  81.                 set.add(a[i] - v[i], i);
  82.                 sum += (i - 1) * a[i];
  83.             }
  84.             k = sum;
  85.             HashSet<Integer> ans = new HashSet<>();
  86.             int last = 0;
  87.             for (int t = n - 1; t > 0; t--) {
  88.                 //Postavil continue --;
  89.                 Pair p = set.first();
  90.                 for (int i = 0; i <= n; i++) {
  91.                     System.out.println(i + " " + set.a[i]);
  92.                 }
  93.                 if (used[p.second] == 1){
  94.  
  95.                 }
  96.                 if (t == 1){
  97.                     last = p.second;
  98.                 }
  99.                 used[p.second] = 1;
  100.                 System.out.println(p.first + " " + p.second);
  101.                 int next = set.ceeling(p.second);
  102.                 long k1 = set.num(next);
  103.                 k1 += pref[p.second] - pref[p.second-interested[p.second]];
  104.                 interested[next] += interested[p.second];
  105.                 set.update(next, k1);
  106.                 k += p.first;
  107.                 if (sum > k){
  108.                     sum = k;
  109.                     for (int m :
  110.                             set.active) {
  111.                         ans.add(m);
  112.                     }
  113.                 }
  114.  
  115.             }
  116.             if (set.a[last] < 0){
  117.                 sum += -a[last];
  118.             }
  119.             System.out.println(sum);
  120.             for (int m:
  121.                  ans) {
  122.                 System.out.print(m + " ");
  123.             }
  124.             System.out.println();
  125.         }
  126.     }
  127.     static class Pair implements Comparable<Pair>{
  128.         long first;
  129.         int second;
  130.  
  131.         public Pair(long first, int second) {
  132.             this.first = first;
  133.             this.second = second;
  134.         }
  135.  
  136.         @Override
  137.         public int compareTo(Pair pair) {
  138.             if (this.first == pair.first) return second - pair.second; else return Long.compare(first, pair.first);
  139.         }
  140.     }
  141.     static int [] prefsumma(int [] a){
  142.         int n = a.length - 1;
  143.         int [] pref = new int [n + 1];
  144.         for (int i = 1; i <= n; i++) {
  145.             pref[i] = pref[i-1] + a[i];
  146.         }
  147.         return pref;
  148.     }
  149. }
Add Comment
Please, Sign In to add comment