Submission #143274

#TimeUsernameProblemLanguageResultExecution timeMemory
143274Bench0310Arranging Shoes (IOI19_shoes)C++14
100 / 100
405 ms142444 KiB
#include <bits/stdc++.h> using namespace std; const int N=200005; int tree[4*N]; int lazy[4*N]; void push(int idx) { tree[2*idx]+=lazy[idx]; lazy[2*idx]+=lazy[idx]; tree[2*idx+1]+=lazy[idx]; lazy[2*idx+1]+=lazy[idx]; lazy[idx]=0; } void update(int idx,int l,int r,int ql,int qr,int val) { if(ql>qr) return; if(l==ql&&r==qr) { tree[idx]+=val; lazy[idx]+=val; } else { push(idx); int m=(l+r)/2; update(2*idx,l,m,ql,min(qr,m),val); update(2*idx+1,m+1,r,max(ql,m+1),qr,val); tree[idx]=min(tree[2*idx],tree[2*idx+1]); } } int query(int idx,int l,int r,int pos) { if(l==r) return tree[idx]; push(idx); int m=(l+r)/2; if(pos<=m) return query(2*idx,l,m,pos); else return query(2*idx+1,m+1,r,pos); } long long count_swaps(vector<int> temp) { int n=temp.size()/2; vector<int> s={0}; for(int i=0;i<2*n;i++) s.push_back(temp[i]); for(int i=1;i<=2*n;i++) update(1,1,2*n,i,i,i); vector<bool> vis(2*n+1,0); queue<int> q[2*n+2]; //left: 2*i, right: 2*i+1 for(int i=1;i<=2*n;i++) { if(s[i]<0) q[-2*s[i]].push(i); else q[2*s[i]+1].push(i); } long long res=0; for(int o=1;o<=2*n;o++) { //cout << "in " << o << endl; if(vis[o]) continue; //cout << "shoe: " << s[o] << endl; if(s[o]<0) { q[-2*s[o]].pop(); //cout << "left shoe" << endl; int pos=q[-2*s[o]+1].front(); //cout << "position of closest pair: " << pos << endl; q[-2*s[o]+1].pop(); int one=query(1,1,2*n,o); int two=query(1,1,2*n,pos); //cout << "actual position of first: " << one << endl; //cout << "actual position of second: " << two << endl; vis[pos]=1; res+=((long long)(two-(one+1))); update(1,1,2*n,o+1,pos-1,1); //update(1,1,2*n,pos,pos,o+1); } else { q[2*s[o]+1].pop(); //cout << "right shoe" << endl; int pos=q[2*s[o]].front(); //cout << "position of closest pair: " << pos << endl; q[2*s[o]].pop(); int one=query(1,1,2*n,o); int two=query(1,1,2*n,pos); //cout << "actual position of first: " << one << endl; //cout << "actual position of second: " << two << endl; vis[pos]=1; res+=((long long)two-one); update(1,1,2*n,o+1,pos-1,1); //update(1,1,2*n,pos,pos,o); } //cout << "res is now " << res << endl; } return res; } /*int main() { cout << count_swaps({2, 1, -1, -2}); return 0; }*/
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...