fork download
  1. #include <iostream>
  2. #include <vector>
  3. #include <algorithm>
  4. using namespace std;
  5. using ll = long long;
  6.  
  7. int main(){
  8. ios::sync_with_stdio(false);
  9. cin.tie(nullptr);
  10.  
  11. int t;
  12. cin >> t;
  13. while(t--){
  14. ll n;
  15. cin >> n;
  16. ll suma = 1, sumb = 1;
  17. // 將 vector 大小調整為 n+1,第 n 個作為哨兵預設值 n
  18. vector<ll> multia(n+1, n), multib(n+1, n), numa(n), numb(n);
  19. vector<char> doa(n), dob(n);
  20.  
  21. for (int i = 0; i < n; i++){
  22. cin >> doa[i] >> numa[i] >> dob[i] >> numb[i];
  23. }
  24.  
  25. // 從 n-1 到 0 更新 multia 與 multib
  26. for (int i = n - 1; i >= 0; i--){
  27. if(doa[i] == 'x' && dob[i] == 'x'){
  28. if(numa[i] > numb[i]){
  29. multia[i] = i;
  30. multib[i] = multib[i+1];
  31. }
  32. else if(numb[i] > numa[i]){
  33. multib[i] = i;
  34. multia[i] = multia[i+1];
  35. }
  36. else{
  37. multia[i] = multia[i+1];
  38. multib[i] = multib[i+1];
  39. }
  40. }
  41. else{
  42. if(doa[i] == 'x')
  43. multia[i] = i;
  44. else
  45. multia[i] = multia[i+1];
  46.  
  47. if(dob[i] == 'x')
  48. multib[i] = i;
  49. else
  50. multib[i] = multib[i+1];
  51. }
  52. }
  53.  
  54. for (int i = 0; i < n; i++){
  55. ll x = 0;
  56. if(doa[i] == '+')
  57. x += numa[i];
  58. else
  59. x += (numa[i] - 1) * suma;
  60.  
  61. if(dob[i] == '+')
  62. x += numb[i];
  63. else
  64. x += (numb[i] - 1) * sumb;
  65.  
  66. if(i < n - 1){
  67. if(multia[i+1] < multib[i+1])
  68. suma += x;
  69. else
  70. sumb += x;
  71. }
  72. else{
  73. cout << suma + sumb + x << "\n";
  74. }
  75. }
  76. }
  77. return 0;
  78. }
Success #stdin #stdout 0.01s 5284KB
stdin
4
3
+ 4 x 2
x 3 x 3
+ 7 + 4
4
+ 9 x 2
x 2 x 3
+ 9 + 10
x 2 + 1
4
x 2 + 1
+ 9 + 10
x 2 x 3
+ 9 x 2
5
x 3 x 3
x 2 x 2
+ 21 + 2
x 2 x 3
+ 41 x 3
stdout
32
98
144
351