Advertisement
Guest User

Untitled

a guest
Jan 25th, 2020
95
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.69 KB | None | 0 0
  1. #include <iostream>
  2. #include <string>
  3. #include <vector>
  4. using namespace std;
  5.  
  6. int T;
  7. int arr[1001001];
  8. int nn,n,x;
  9. vector<int> rgt;
  10. vector<int> lft;
  11.  
  12.  
  13. int sgt[1001001];
  14.  
  15. void inc(int l,int r){
  16. for(int i=l;i<=r;i++){
  17. sgt[i]++;
  18. }
  19. }
  20. void dec(int l,int r){
  21. for(int i=l;i<=r;i++){
  22. if(sgt[i] > 0)sgt[i]--;
  23. }
  24. }
  25.  
  26. int cnt(int l,int r){
  27. int ret=0;
  28. for(int i=l;i<=r;i++){
  29. if(sgt[i] > 0)ret++;
  30. }
  31. return ret;
  32. }
  33. int main(){
  34. freopen("chairs.in","r",stdin);
  35. cin>>T;
  36. while(T--){
  37. cin>>nn;
  38. int prv= -2;
  39. n=0;
  40. int count =0;
  41. for(int i=0;i<nn;i++){
  42. cin>>x;
  43. count += x;
  44. if(x == 1){
  45. arr[n++] = i - prv -1;
  46. prv = i;
  47. }
  48. }
  49. if(count > (nn+1)/2){
  50. cout<<-1<<endl;
  51. continue;
  52. }
  53. arr[n++] = nn - prv;
  54. for(int i=0;i<=n;i++){
  55. sgt[i]=0;
  56. }
  57. rgt.clear();
  58. lft.clear();
  59. for(int i=n-1;i>=0;i--){
  60. while(arr[i] > 1){
  61. rgt.push_back(i);
  62. arr[i]--;
  63. }
  64. }
  65.  
  66. long long sol = 0;
  67. for(int i=0;i<n;i++){
  68. if(arr[i] != 0){
  69. while(rgt.size() > 0 && rgt.back() <= i){
  70. lft.push_back(rgt.back());
  71. rgt.pop_back();
  72. }
  73. continue;
  74. }
  75. bool take_left;
  76. if(rgt.size() == 0){
  77. take_left=true;
  78. } else if(lft.size() == 0){
  79. take_left=false;
  80. } else {
  81. int L_i = lft.back();
  82. int R_i = rgt.back();
  83. if(i - L_i - 2*cnt(L_i,i-1) <= R_i - i){
  84. take_left=true;
  85. } else {
  86. take_left=false;
  87. }
  88. }
  89.  
  90. if(take_left){
  91. int L_i = lft.back();
  92. lft.pop_back();
  93. sol += i - L_i - 2*cnt(L_i,i-1);
  94. dec(L_i,i-1);
  95. } else {
  96. int R_i = rgt.back();
  97. rgt.pop_back();
  98. sol += R_i - i;
  99. inc(i,R_i-1);
  100. }
  101. }
  102. cout<<sol<<endl;
  103. }
  104. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement