fork download
  1. #include <bits/stdc++.h>
  2. #define FOR(i,l,r) for(int i = l ; i <= r ; i ++)
  3. #define FORD(i,r,l) for(int i = r ; i >= l ; i --)
  4. #define REP(i, a ) for(int i = 0 ; i < a ; i ++ )
  5. #define compare(v) sort((v).begin(), (v).end()); (v).erase(unique((v).begin(), (v).end()), (v).end());
  6. #define ll long long
  7. #define el "\n"
  8. #define fi first
  9. #define se second
  10. #define _ROOT_ int main()
  11. #define M 1000000007
  12. #define MAXN 1000001
  13. #define INF (1ll<<30)
  14. #define NAME "file"
  15. using namespace std;
  16.  
  17. ll n, m, q, ans ;
  18. ll a[MAXN] ;
  19. ll lab[MAXN ] ;
  20. ll res[MAXN ] ;
  21. vector<ll> p[MAXN ] ;
  22. bool active[MAXN ] ;
  23.  
  24. ll calc(ll a ) {
  25. return a * (a + 1 ) / 2 ;
  26. }
  27.  
  28. ll find_set(ll a ) {
  29. return lab[a] < 0 ? a : lab[a] = find_set(lab[a] ) ;
  30. }
  31.  
  32. bool union_set(ll a, ll b ) {
  33. if(active[a] == false ) return false ;
  34. if(active[b] == false ) return false ;
  35. a = find_set(a) ;
  36. b = find_set(b) ;
  37. if(a == b ) return false ;
  38. if(lab[a] > lab[b] ) swap(a, b ) ;
  39. ans -= calc(-lab[a]) ;
  40. ans -= calc(-lab[b]) ;
  41. lab[a] += lab[b] ;
  42. ans += calc(-lab[a]) ;
  43. lab[b] = a ;
  44. return true ;
  45. }
  46.  
  47. void init() {
  48. cin >> n ;
  49. FOR(i, 1, n ) cin >> a[i] ;
  50. ans = 0 ;
  51. }
  52.  
  53. void solve() {
  54. n -- ;
  55. FOR(i, 1, n ) a[i] = abs(a[i] - a[i + 1] ) ;
  56. FOR(i, 1, n ) lab[i] = - 1 ;
  57. FOR(i, 1, n ) p[a[i]].push_back(i) ;
  58. FORD(i, n, 1 ) {
  59. for(ll v : p[i]) {
  60. active[v] = true ;
  61. ans ++ ;
  62. union_set(v + 1, v ) ;
  63. union_set(v, v - 1 ) ;
  64. }
  65. res[i] = ans ;
  66. }
  67. FOR(i, 1, n ) cout << res[i] << " " ;
  68. cout << el ;
  69. FOR(i, 1, n ) p[i].clear(), active[i] = false ;
  70. }
  71.  
  72. _ROOT_ {
  73. // freopen(NAME".inp" , "r" , stdin);
  74. // freopen(NAME".out" , "w", stdout) ;
  75. ios_base::sync_with_stdio(0);
  76. cin.tie(0);
  77. cout.tie(0);
  78. int t = 1;
  79. // cin >> t ;
  80. while(t--) {
  81. init();
  82. solve();
  83. }
  84. return (0&0);
  85. }
  86.  
Success #stdin #stdout 0.01s 28616KB
stdin
Standard input is empty
stdout