fork download
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define endl '\n'
  4. #define int long long
  5. const int MOD = 158400;
  6. const int MOD2 = 998244353;
  7. const int INF = LLONG_MAX/2;
  8.  
  9. int primes[1000000];
  10.  
  11. void seive(){
  12. fill(primes, primes + 1000000, 1);
  13. primes[0] = primes[1] = 0;
  14. for(int i = 2 ; i*i < 1000000 ; i++){
  15. if(primes[i]){
  16. for(int j = i*i ; j < 1000000 ; j += i){
  17. primes[j] = 0;
  18. }
  19. }
  20. }
  21. for(int i = 1 ; i < 1000000 ; i++){
  22. primes[i] += primes[i-1];
  23. }
  24. }
  25. int factorial(int n){
  26. if(n==0){
  27. return 1;
  28. }
  29. return (n*(factorial(n-1)))%MOD;
  30. }
  31. bool isPrime(int n){
  32. if(n <= 1) return false;
  33. for(int i = 2 ; i*i <= n ; i++){
  34. if(n % i == 0) return false;
  35. }
  36. return true;
  37. }
  38.  
  39. int power(int a, int b){
  40. if(b == 0) return 1;
  41. a %= MOD;
  42. int value = power(a, b / 2);
  43. if(b % 2 == 0){
  44. return (value * value) % MOD;
  45. } else {
  46. return ((value * value) % MOD * (a % MOD)) % MOD;
  47. }
  48. }
  49.  
  50. int gcd(int a, int b){
  51. if(a == 0) return b;
  52. return gcd(b % a, a);
  53. }
  54. void solve() {
  55. int n, m;
  56. cin >> n >> m;
  57.  
  58. // Only one row is used, so we don't need a 2D array.
  59. vector<int> A(m);
  60. for(int i = 0; i < m; ++i) {
  61. cin >> A[i];
  62. }
  63.  
  64. // Prefix sums for both players
  65. vector<int> count1(m, 0), sum1(m, 0);
  66. vector<int> count2(m, 0), sum2(m, 0);
  67.  
  68. int c1 = 0, s1 = 0;
  69. int c2 = 0, s2 = 0;
  70.  
  71. for(int i = 0; i < m; ++i) {
  72. if(A[i] == 1 || A[i] == 3) {
  73. c1++;
  74. s1 += i;
  75. }
  76. if(A[i] == 2 || A[i] == 3) {
  77. c2++;
  78. s2 += i;
  79. }
  80. count1[i] = c1;
  81. sum1[i] = s1;
  82. count2[i] = c2;
  83. sum2[i] = s2;
  84. }
  85.  
  86. for(int i = 0; i < m; ++i) {
  87. int leftCount1 = (i > 0) ? count1[i-1] : 0;
  88. int leftSum1 = (i > 0) ? sum1[i-1] : 0;
  89. int rightCount1 = count1[m-1] - leftCount1;
  90. int rightSum1 = sum1[m-1] - leftSum1;
  91. int total1 = (i * leftCount1) - leftSum1 + rightSum1 - (i * rightCount1);
  92.  
  93. int leftCount2 = (i > 0) ? count2[i-1] : 0;
  94. int leftSum2 = (i > 0) ? sum2[i-1] : 0;
  95. int rightCount2 = count2[m-1] - leftCount2;
  96. int rightSum2 = sum2[m-1] - leftSum2;
  97. int total2 = (i * leftCount2) - leftSum2 + rightSum2 - (i * rightCount2);
  98.  
  99. cout << abs(total1 - total2) << " ";
  100. }
  101. cout << endl;
  102. }
  103.  
  104. signed main(){
  105. ios::sync_with_stdio(false); cin.tie(NULL);
  106. int t;
  107. cin >> t;
  108. while(t--){
  109. solve();
  110. }
  111. return 0;
  112. }
  113.  
  114.  
Success #stdin #stdout 0.01s 5236KB
stdin
2
1 5
2 1 3 0 1
1 8
1 1 3 0 2 0 3 3
stdout
5 2 1 0 1 
3 2 1 4 7 8 9 10