(UPD: 2024-12-04 14:48 UTC) Judge is not working due to Cloudflare incident. (URL) We can do nothing about it, sorry. After the incident is resolved, we will grade all submissions.

Submission #1115073

#TimeUsernameProblemLanguageResultExecution timeMemory
1115073Paz15Seats (IOI18_seats)C++17
100 / 100
2274 ms134984 KiB
//fast #include<bits/stdc++.h> #include "seats.h" using namespace std; typedef long long ll; typedef long double ld; #define rep(n) for(int i = 0 ; i<n ; i++) #define all(x) x.begin(),x.end() #define pb push_back int n,m; vector<vector<int>> chart; vector<int> wier; vector<int> kol; const int base = (1<<20); int ile[base*2]; int sum[base*2][2]; int mini[base*2][2]; void print(){ cout << " " << ile[1] << '\n'; cout << " " << ile[2] << ' ' << ile[3] << " \n"; cout << ile[4] << ' ' << ile[5] << ' ' << ile[6] << ' ' << ile[7] << '\n'; cout << " " << mini[1][0] << '\n'; cout << " " << mini[2][0] << ' ' << mini[3][0] << " \n"; cout << mini[4][0] << ' ' << mini[5][0] << ' ' << mini[6][0] << ' ' << mini[7][0] << '\n'; cout << " " << mini[1][1] << '\n'; cout << " " << mini[2][1] << ' ' << mini[3][1] << " \n"; cout << mini[4][1] << ' ' << mini[5][1] << ' ' << mini[6][1] << ' ' << mini[7][1] << '\n'; cout << " " << sum[1][0] << '\n'; cout << " " << sum[2][0] << ' ' << sum[3][0] << " \n"; cout << sum[4][0] << ' ' << sum[5][0] << ' ' << sum[6][0] << ' ' << sum[7][0] << '\n'; cout << " " << sum[1][1] << '\n'; cout << " " << sum[2][1] << ' ' << sum[3][1] << " \n"; cout << sum[4][1] << ' ' << sum[5][1] << ' ' << sum[6][1] << ' ' << sum[7][1] << '\n'; } void dodaj(int l, int r, int p, int k, int w, int c, bool xd){ if (r<p || k<l) return; if (p<=l && r<=k){ mini[w][xd]+=c; sum[w][xd]+=c; return; } dodaj(l,(l+r)/2,p,k,w*2,c,xd); dodaj((l+r)/2+1,r,p,k,w*2+1,c,xd); if (mini[w*2][0]<mini[w*2+1][0]){ mini[w][0] = mini[w*2][0]; mini[w][1] = mini[w*2][1]; ile[w] = ile[w*2]; }else if (mini[w*2][0]>mini[w*2+1][0]){ mini[w][0] = mini[w*2+1][0]; mini[w][1] = mini[w*2+1][1]; ile[w] = ile[w*2+1]; }else{ if (mini[w*2][1]<mini[w*2+1][1]){ mini[w][0] = mini[w*2][0]; mini[w][1] = mini[w*2][1]; ile[w] = ile[w*2]; }else if (mini[w*2][1]>mini[w*2+1][1]){ mini[w][0] = mini[w*2+1][0]; mini[w][1] = mini[w*2+1][1]; ile[w] = ile[w*2+1]; }else{ mini[w][0] = mini[w*2][0]; mini[w][1] = mini[w*2][1]; ile[w] = ile[w*2+1]+ile[w*2]; } } mini[w][0]+=sum[w][0]; mini[w][1]+=sum[w][1]; } void smallsort(vector<int> &v){ if (v[1]<v[0]) swap(v[0],v[1]); if (v[3]<v[2]) swap(v[2],v[3]); if (v[2]<v[0]) swap(v[0],v[2]); if (v[2]<v[1]) swap(v[1],v[2]); if (v[3]<v[1]) swap(v[1],v[3]); if (v[3]<v[2]) swap(v[2],v[3]); } void give_initial_chart(int h, int w, vector<int> r, vector<int> c){ for (int i = base ; i<base*2 ; i++) ile[i] = 1; for (int i = 19 ; i>=0 ; i--){ for (int j = (1<<i) ; j<(1<<(i+1)) ; j++){ ile[j] = ile[j*2]+ile[j*2+1]; } } n = h; m = w; wier = r; kol = c; chart.resize(n+2); rep(h+2){ chart[i].resize(m+2); } for (int i = 0 ; i<n*m ; i++){ chart[r[i]+1][c[i]+1] = i; wier[i]++; kol[i]++; } for (int i = 0 ; i<m+2 ; i++){ chart[0][i] = base; chart[n+1][i] = base; } for (int i = 0 ; i<n+2 ; i++){ chart[i][0] = base; chart[i][m+1] = base; } for (int i = 0 ; i<=n ; i++){ for (int j = 0 ; j<=m ; j++){ vector<int> v = {chart[i][j],chart[i+1][j],chart[i][j+1],chart[i+1][j+1]}; smallsort(v); dodaj(0,base-1,v[0],v[1]-1,1,1,0); if (v[2]>(n*m)) continue; dodaj(0,base-1,v[2],v[3]-1,1,1,1); } } } int swap_seats(int a, int b){ for (int i = wier[a]-1 ; i<=wier[a] ; i++){ for (int j = kol[a]-1 ; j<=kol[a] ; j++){ vector<int> v = {chart[i][j],chart[i+1][j],chart[i][j+1],chart[i+1][j+1]}; smallsort(v); dodaj(0,base-1,v[0],v[1]-1,1,-1,0); if (v[2]>(n*m)) continue; dodaj(0,base-1,v[2],v[3]-1,1,-1,1); } } for (int i = wier[b]-1 ; i<=wier[b] ; i++){ for (int j = kol[b]-1 ; j<=kol[b] ; j++){ vector<int> v = {chart[i][j],chart[i+1][j],chart[i][j+1],chart[i+1][j+1]}; smallsort(v); dodaj(0,base-1,v[0],v[1]-1,1,-1,0); if (v[2]>(n*m)) continue; dodaj(0,base-1,v[2],v[3]-1,1,-1,1); } } swap(chart[wier[a]][kol[a]],chart[wier[b]][kol[b]]); swap(wier[a],wier[b]); swap(kol[a],kol[b]); for (int i = wier[a]-1 ; i<=wier[a] ; i++){ for (int j = kol[a]-1 ; j<=kol[a] ; j++){ vector<int> v = {chart[i][j],chart[i+1][j],chart[i][j+1],chart[i+1][j+1]}; smallsort(v); dodaj(0,base-1,v[0],v[1]-1,1,1,0); if (v[2]>(n*m)) continue; dodaj(0,base-1,v[2],v[3]-1,1,1,1); } } for (int i = wier[b]-1 ; i<=wier[b] ; i++){ for (int j = kol[b]-1 ; j<=kol[b] ; j++){ vector<int> v = {chart[i][j],chart[i+1][j],chart[i][j+1],chart[i+1][j+1]}; smallsort(v); dodaj(0,base-1,v[0],v[1]-1,1,1,0); if (v[2]>(n*m)) continue; dodaj(0,base-1,v[2],v[3]-1,1,1,1); } } return (n*m)-base+ile[1]; } /*int main(){ ios_base::sync_with_stdio(0); cin.tie(0); int h,w,q; cin >> h >> w >> q; vector<int> r(h*w); vector<int> c(h*w); rep(h*w){ cin >> r[i] >> c[i]; } give_initial_chart(h,w,r,c); rep(q){ int a,b; cin >> a >> b; cout << swap_seats(a,b) << '\n'; } }*/
#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...