Advertisement
paranid5

07.02 2

Feb 7th, 2022
1,306
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Dart 7.93 KB | None | 0 0
  1. // ignore_for_file: unused_element
  2.  
  3. import 'dart:collection';
  4. import 'dart:io';
  5. import 'dart:math';
  6.  
  7. extension on int {
  8.   List<int> getDivs(final bool Function(int) predicate) {
  9.     final divs = List<int>.empty(growable: true);
  10.  
  11.     for (int i = 1; i * i <= this; i++) {
  12.       if (this % i == 0) {
  13.         if (predicate(i)) {
  14.           divs.add(i);
  15.         }
  16.  
  17.         if (i * i < this && predicate(this ~/ i)) {
  18.           divs.add(this ~/ i);
  19.         }
  20.       }
  21.     }
  22.  
  23.     return divs;
  24.   }
  25.  
  26.   bool get isSimple {
  27.     for (int i = 2; i * i <= this; i++) {
  28.       if (this % i == 0) {
  29.         return false;
  30.       }
  31.     }
  32.  
  33.     return true;
  34.   }
  35. }
  36.  
  37. extension on bool {
  38.   bool arrow(final bool other) => !(this && !other);
  39. }
  40.  
  41. extension on List<int> {
  42.   List<int> sortAndGet([int Function(int, int)? compare]) {
  43.     sort(compare);
  44.     return this;
  45.   }
  46. }
  47.  
  48. extension IntIterableExt on Iterable<int> {
  49.   int get sum => fold(0, (acc, x) => acc + x);
  50.  
  51.   static Iterable<int> createRange(
  52.       final int startInclusive,
  53.       [final int endExclusive = 2000000000]
  54.       ) => Iterable.generate(endExclusive - startInclusive, (x) => x + startInclusive);
  55.  
  56.   static Iterable<int> createDownRange(
  57.       final int startInclusive,
  58.       final int endExclusive
  59.       ) => Iterable.generate(startInclusive - endExclusive, (x) => startInclusive - x);
  60. }
  61.  
  62. extension ComparableByIterableExt<T, V extends Comparable> on Iterable<T> {
  63.   T maxBy(final V Function(T elem) func) {
  64.     var iter = iterator; iter.moveNext();
  65.     var max = iter.current;
  66.  
  67.     while (iter.moveNext()) {
  68.       if (func(max).compareTo(func(iter.current)) < 0) {
  69.         max = iter.current;
  70.       }
  71.     }
  72.  
  73.     return max;
  74.   }
  75.  
  76.   T minBy(final V Function(T elem) func) {
  77.     var iter = iterator; iter.moveNext();
  78.     var max = iter.current;
  79.  
  80.     while (iter.moveNext()) {
  81.       if (func(max).compareTo(func(iter.current)) > 0) {
  82.         max = iter.current;
  83.       }
  84.     }
  85.  
  86.     return max;
  87.   }
  88. }
  89.  
  90. extension ComparableIterExt<T extends Comparable> on Iterable<T> {
  91.   T get max => maxBy((elem) => elem);
  92.   T get min => minBy((elem) => elem);
  93. }
  94.  
  95. extension IterableExt<T> on Iterable<T> {
  96.   int count(final T predicate) => where((element) => element == predicate).length;
  97.   int countWhere(final bool Function(T it) func) => where((element) => func(element)).length;
  98.  
  99.   Iterable<T> stepBy(final int step) {
  100.     final list = List<T>.empty(growable: true);
  101.     final thisList = toList();
  102.  
  103.     for (int i = 0; i < length; i += step) {
  104.       list.add(thisList[i]);
  105.     }
  106.  
  107.     return list;
  108.   }
  109.  
  110.   void forEachIndexed(final void Function(int index, T elem) action) {
  111.     final iter = iterator;
  112.  
  113.     for (int i = 0; i < length; i++) {
  114.       iter.moveNext();
  115.       action(i, iter.current);
  116.     }
  117.   }
  118.  
  119.   Iterable<T> filterIndexed(final bool Function(int index, T elem) predicate) {
  120.     final list = List<T>.empty(growable: true);
  121.     final thisList = toList();
  122.  
  123.     for (int i = 0; i < length; i++) {
  124.       final elem = thisList[i];
  125.       if (predicate(i, elem)) {
  126.         list.add(elem);
  127.       }
  128.     }
  129.  
  130.     return list;
  131.   }
  132.  
  133.   bool allIndexed(final bool Function(int index, T elem) predicate) {
  134.     final iter = iterator;
  135.  
  136.     for (int i = 0; i < length; i++) {
  137.       iter.moveNext();
  138.       if (!predicate(i, iter.current)) {
  139.         return false;
  140.       }
  141.     }
  142.  
  143.     return true;
  144.   }
  145. }
  146.  
  147. extension ListExt<T> on List<T> {
  148.   List<T> getSorted([final int Function(T x, T y)? compare]) {
  149.     sort(compare);
  150.     return this;
  151.   }
  152.  
  153.   List<T> without(final T elem) {
  154.     final copy = toList(growable: true);
  155.     copy.remove(elem);
  156.     return copy;
  157.   }
  158.  
  159.   List<T> withElem(final T elem) {
  160.     final copy = toList(growable: true);
  161.     copy.add(elem);
  162.     return copy;
  163.   }
  164.  
  165.   List<T> operator-(final T elem) => without(elem);
  166.   List<T> operator+(final T elem) => withElem(elem);
  167. }
  168.  
  169. extension on String {
  170.   Iterable<int> get digits => codeUnits.map((e) => e - '0'.codeUnitAt(0));
  171.  
  172.   String repeat(final int amount) {
  173.     String value = "";
  174.  
  175.     for (var i = 0; i < amount; i++) {
  176.       value += this;
  177.     }
  178.  
  179.     return value;
  180.   }
  181.  
  182.   int count(final Pattern patter) => split(patter).length - 1;
  183.  
  184.   int parseInt() => int.parse(this);
  185.   int? tryParseInt() => int.tryParse(this);
  186. }
  187.  
  188. extension HighOrderFunctions<T, R> on T {
  189.   R let(final R Function(T it) func) => func(this);
  190.  
  191.   T also(final R Function(T it) func) {
  192.     func(this);
  193.     return this;
  194.   }
  195.  
  196.   T? takeIf(final bool Function(T it) func) => func(this) ? this : null;
  197. }
  198.  
  199. class Pair<F, S> {
  200.   F first;
  201.   S second;
  202.   Pair(this.first, this.second);
  203.  
  204.   @override
  205.   String toString() => '($first, $second)';
  206.  
  207.   @override
  208.   bool operator ==(Object other) {
  209.     if (identical(this, other)) return true;
  210.     if (other is! Pair<F, S>) return false;
  211.     return first == other.first && second == other.second;
  212.   }
  213. }
  214.  
  215. final invalid = Pair(0, 1e9.toInt());
  216.  
  217. Pair<int, int> dfs(
  218.     final int n,
  219.     final int m,
  220.     final List<List<int>> tab,
  221.     final List<List<Pair<int, int>>> dp
  222. ) {
  223.   if (n >= tab.length || m < 0) {
  224.     return invalid;
  225.   }
  226.  
  227.   if (dp[n][m] != invalid) {
  228.     return dp[n][m];
  229.   }
  230.  
  231.   if ((n == 3 && m >= 6 && m <= 10) || (n == 0 && m == 13) || (n == 7 && m == 2) || (n == 8 && m == 16)) {
  232.     // границы -
  233.     final f = dfs(n, m - 1, tab, dp);
  234.     dp[n][m] = Pair(f.first + tab[n][m], f.second + tab[n][m]);
  235.   } else if ((n == 1 && m == 14) || (n == 8 && m == 3) || (n == 9 && m == 17)) {
  236.     final f = dfs(n + 1, m, tab, dp);
  237.     dp[n][m] = Pair(f.first + tab[n][m], f.second + tab[n][m]);
  238.   } else {
  239.     // нет границ
  240.     final f = dfs(n + 1, m, tab, dp);
  241.     final s = dfs(n, m - 1, tab, dp);
  242.     dp[n][m] = Pair(max(f.first, s.first) + tab[n][m], min(f.second, s.second) + tab[n][m]);
  243.   }
  244.  
  245.   return dp[n][m];
  246. }
  247. var cnt = 0;
  248.  
  249. void rec(final List<int> container, [final int n = 500]) {
  250.   if (n <= 0) {
  251.     if (n == 0 && container.contains(5)) cnt++;
  252.     return;
  253.   }
  254.  
  255.   rec(container.withElem(n), n - 1);
  256.   rec(container.withElem(n), n ~/ 2);
  257. }
  258.  
  259. Future<void> main(final List<String> arguments) async =>
  260.     (await File('kek.txt').readAsLines()).let((input) {
  261.       final m = input.first.split(' ').last.parseInt();
  262.  
  263.       final products = input
  264.           .skip(1)
  265.           .map((e) =>
  266.             HighOrderFunctions<List<String>, Pair<int, String>>(e.split(' '))
  267.                 .let((it) => Pair(it.first.parseInt(), it.last))
  268.           )
  269.           .toList(growable: false)
  270.           .getSorted((x, y) => x.first.compareTo(y.first));
  271.  
  272.       final qProducts = products
  273.           .where((element) => element.second == 'Q')
  274.           .toList(growable: false);
  275.  
  276.       final zProducts = Queue<Pair<int, String>>.from(
  277.           products.where((element) => element.second == 'Z')
  278.       );
  279.  
  280.       var sum = 0;
  281.  
  282.       final maxLen = products.takeWhile((value) {
  283.         if (sum + value.first > m) {
  284.           return false;
  285.         } else {
  286.           sum += value.first;
  287.           return true;
  288.         }
  289.       }).length;
  290.  
  291.       sum = 0;
  292.  
  293.       final curQProducts = qProducts.takeWhile((value) {
  294.         if (sum + value.first > m) {
  295.           return false;
  296.         } else {
  297.           sum += value.first;
  298.           return true;
  299.         }
  300.       })
  301.       .toList();
  302.  
  303.       var curZProductsLen = 0;
  304.  
  305.       while (sum < m) {
  306.         if (sum + zProducts.first.first > m) {
  307.           break;
  308.         }
  309.  
  310.         final elem = zProducts.removeFirst();
  311.         curZProductsLen++;
  312.         sum += elem.first;
  313.       }
  314.  
  315.       while (curQProducts.length + curZProductsLen < maxLen) {
  316.         sum -= curQProducts.removeLast().first;
  317.  
  318.         while (sum <= m) {
  319.           if (sum + zProducts.first.first > m) {
  320.             break;
  321.           }
  322.  
  323.           final elem = zProducts.removeFirst();
  324.           curZProductsLen++;
  325.           sum += elem.first;
  326.         }
  327.       }
  328.  
  329.       print('${curQProducts.length} ${m - sum}');
  330.     });
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement