제출 #294937

#제출 시각아이디문제언어결과실행 시간메모리
294937FashoArranging Shoes (IOI19_shoes)C++14
100 / 100
493 ms419368 KiB
#include <bits/stdc++.h> #define N 200005 #define ll long long int #define fo(i,x,y) for(int i=x;i<=y;i++) #define fs(ar,n) fo(i,1,n) cin>>ar[i] #define sp " " #define fast cin.tie(0);cout.tie(0);ios_base::sync_with_stdio(false) #define pb push_back #define ppb pop_back #define fi first #define se second #define ii pair<int,int> #define lli pair<ll,ll> #include "shoes.h" using namespace std; ll n,m,ar[N],sum,tree[4*N],lazy[4*N],mark[N],tutmac[N][3],tut[N]; stack<int> st[N][3]; void build(int ind,int l,int r) { if(l==r) { tree[ind]=l; return; } int mid=(l+r)/2; build(ind*2,l,mid); build(ind*2+1,mid+1,r); } void push(int ind,int l,int r) { ll x=lazy[ind]; lazy[ind]=0; tree[ind]+=x; if(l==r) return; lazy[ind*2]+=x; lazy[ind*2+1]+=x; } ll query(int ind,int l,int r,int a) { if(l>a || r<a) return 0; push(ind,l,r); if(l==r) return tree[ind]; int mid=(l+r)/2; if(a<=mid) return query(ind*2,l,mid,a); else return query(ind*2+1,mid+1,r,a); } void upd(int ind,int l,int r,int a,int b) { if(l>b || r<a) return; push(ind,l,r); if(l>=a && r<=b) { lazy[ind]++; push(ind,l,r); return; } int mid=(l+r)/2; upd(ind*2,l,mid,a,b); upd(ind*2+1,mid+1,r,a,b); } void pre() { for(int i=n;i>=1;i--) { if(ar[i]<0) st[-ar[i]][0].push(i); else st[ar[i]][1].push(i); } } long long count_swaps(std::vector<int> s) { n=s.size(); fo(i,1,n) ar[i]=s[i-1]; pre(); build(1,1,n); // cout<<query(1,1,n,7)<<endl; // upd(1,1,n,1,6); // upd(1,1,n,2,4); // cout<<query(1,1,n,7)<<endl; // cout<<endl; fo(i,1,n) { if(mark[i]) continue; mark[i]=1; if(ar[i]>0) { while(mark[st[ar[i]][0].top()]) st[ar[i]][0].pop(); ll x=st[ar[i]][0].top(); mark[x]=1; ll a=query(1,1,n,i); ll b=query(1,1,n,x); sum+=b-a; // cerr<<i<<sp<<x<<sp<<a<<sp<<b<<endl; upd(1,1,n,i,x-1); } else { while(mark[st[-ar[i]][1].top()]) st[-ar[i]][1].pop(); ll x=st[-ar[i]][1].top(); mark[x]=1; ll a=query(1,1,n,i); ll b=query(1,1,n,x); sum+=b-a-1; // cerr<<i<<sp<<x<<sp<<a<<sp<<b<<endl; upd(1,1,n,i,x-1); } } return sum; } // int main() { // int n; // assert(1 == scanf("%d", &n)); // vector<int> S(2 * n); // for (int i = 0; i < 2 * n; i++) // assert(1 == scanf("%d", &S[i])); // fclose(stdin); // long long result = count_swaps(S); // printf("%lld\n", result); // fclose(stdout); // 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...