Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <string>
- #include <vector>
- using namespace std;
- int T;
- int arr[1001001];
- int nn,n,x;
- vector<int> rgt;
- vector<int> lft;
- int sgt[1001001];
- void inc(int l,int r){
- for(int i=l;i<=r;i++){
- sgt[i]++;
- }
- }
- void dec(int l,int r){
- for(int i=l;i<=r;i++){
- if(sgt[i] > 0)sgt[i]--;
- }
- }
- int cnt(int l,int r){
- int ret=0;
- for(int i=l;i<=r;i++){
- if(sgt[i] > 0)ret++;
- }
- return ret;
- }
- int main(){
- freopen("chairs.in","r",stdin);
- cin>>T;
- while(T--){
- cin>>nn;
- int prv= -2;
- n=0;
- int count =0;
- for(int i=0;i<nn;i++){
- cin>>x;
- count += x;
- if(x == 1){
- arr[n++] = i - prv -1;
- prv = i;
- }
- }
- if(count > (nn+1)/2){
- cout<<-1<<endl;
- continue;
- }
- arr[n++] = nn - prv;
- for(int i=0;i<=n;i++){
- sgt[i]=0;
- }
- rgt.clear();
- lft.clear();
- for(int i=n-1;i>=0;i--){
- while(arr[i] > 1){
- rgt.push_back(i);
- arr[i]--;
- }
- }
- long long sol = 0;
- for(int i=0;i<n;i++){
- if(arr[i] != 0){
- while(rgt.size() > 0 && rgt.back() <= i){
- lft.push_back(rgt.back());
- rgt.pop_back();
- }
- continue;
- }
- bool take_left;
- if(rgt.size() == 0){
- take_left=true;
- } else if(lft.size() == 0){
- take_left=false;
- } else {
- int L_i = lft.back();
- int R_i = rgt.back();
- if(i - L_i - 2*cnt(L_i,i-1) <= R_i - i){
- take_left=true;
- } else {
- take_left=false;
- }
- }
- if(take_left){
- int L_i = lft.back();
- lft.pop_back();
- sol += i - L_i - 2*cnt(L_i,i-1);
- dec(L_i,i-1);
- } else {
- int R_i = rgt.back();
- rgt.pop_back();
- sol += R_i - i;
- inc(i,R_i-1);
- }
- }
- cout<<sol<<endl;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement