Advertisement
Guest User

Untitled

a guest
Jun 25th, 2019
67
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.03 KB | None | 0 0
  1. // Solucao Informatica Avancado Semana 59
  2. // Thiago Mota
  3.  
  4. #include <bits/stdc++.h>
  5.  
  6. using namespace std;
  7. const int maxn = 100010;
  8. int f[maxn];
  9. int n;
  10.  
  11. int main() {
  12. int k;
  13. cin >> n >> k;
  14. int l=maxn, r=-1; // l = menor valor, r = maior valor
  15. for(int i=1;i<=n;i++) {
  16. int x;
  17. cin >> x;
  18. l = min(l, x);
  19. r = max(r, x);
  20. f[x]++;
  21. }
  22.  
  23. int ans=0;
  24. // Two pointers
  25. while(true) {
  26. while(l < r && f[l] == 0) l++; // Se a frequencia de l for igual a 0 significa que o menor valor esta mais a direita.
  27. while(l < r && f[r] == 0) r--; // Mesma coisa aplicada ao r.
  28.  
  29. if(r - l <= k) break;
  30. if(l >= r) break;
  31.  
  32. // Agora l e r mantem respectivamente o menor e o maior valor.
  33. int c = min(f[l], f[r]);
  34.  
  35. // Para aumentar l em 1, basta aumentar a frequencia de l+1 e diminuir de l
  36. f[l+1] += c;
  37. f[l] -= c;
  38.  
  39. // Para diminuir r em 1, basta diminuir a frequencia de r e aumentar de r-1
  40. f[r] -= c;
  41. f[r-1] += c;
  42.  
  43. ans += c; // Aumenta o número de operacoes em c, pois fizemos isso para "c" ocorrencias de l e r
  44. }
  45. cout << ans << "\n";
  46. return 0;
  47. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement