Submission #1164856

#TimeUsernameProblemLanguageResultExecution timeMemory
1164856Hanksburger자리 배치 (IOI18_seats)C++17
100 / 100
2290 ms103312 KiB
#include "seats.h" #include <bits/stdc++.h> using namespace std; pair<int, int> seg[4000005]; vector<vector<int> > rect; int lazy[4000005], n, m; vector<int> a, b; pair<int, int> combine(pair<int, int> x, pair<int, int> y) { if (x.first<y.first) return x; if (x.first>y.first) return y; return {x.first, x.second+y.second}; } void push(int i, int l, int r) { if (l<r) { seg[i*2].first+=lazy[i]; seg[i*2+1].first+=lazy[i]; lazy[i*2]+=lazy[i]; lazy[i*2+1]+=lazy[i]; } lazy[i]=0; } void build(int i, int l, int r) { if (l==r) { seg[i]={0, 1}; return; } int mid=(l+r)/2; build(i*2, l, mid); build(i*2+1, mid+1, r); seg[i]=combine(seg[i*2], seg[i*2+1]); } void upd(int i, int l, int r, int ql, int qr, int val) { if (ql<=l && r<=qr) { seg[i].first+=val; lazy[i]+=val; return; } push(i, l, r); int mid=(l+r)/2; if (l<=qr && ql<=mid) upd(i*2, l, mid, ql, qr, val); if (mid<qr && ql<=r) upd(i*2+1, mid+1, r, ql, qr, val); seg[i]=combine(seg[i*2], seg[i*2+1]); } pair<int, int> qry(int i, int l, int r, int ql, int qr) { if (ql<=l && r<=qr) return seg[i]; push(i, l, r); int mid=(l+r)/2; pair<int, int> res={1e9, 1}; if (l<=qr && ql<=mid) res=combine(res, qry(i*2, l, mid, ql, qr)); if (mid<qr && ql<=r) res=combine(res, qry(i*2+1, mid+1, r, ql, qr)); return res; } void update(int x, int y, int val) { //cout << "update " << x << ' ' << y << ' ' << "val: "; vector<int> tmp; tmp.push_back(x==0?n*m:(y==0?n*m:rect[x-1][y-1])); tmp.push_back(x==0?n*m:(y==m?n*m:rect[x-1][y])); tmp.push_back(x==n?n*m:(y==0?n*m:rect[x][y-1])); tmp.push_back(x==n?n*m:(y==m?n*m:rect[x][y])); sort(tmp.begin(), tmp.end()); //cout << tmp[0] << ' ' << tmp[1] << ' ' << tmp[2] << ' ' << tmp[3] << '\n'; if (tmp[0]<tmp[1]) upd(1, 0, n*m, tmp[0], tmp[1]-1, val); if (tmp[2]<tmp[3]) upd(1, 0, n*m, tmp[2], tmp[3]-1, val); } void give_initial_chart(int N, int M, vector<int> A, vector<int> B) { n=N, m=M, a=A, b=B; for (int i=0; i<n; i++) { vector<int> tmp(m); rect.push_back(tmp); } for (int i=0; i<n*m; i++) rect[a[i]][b[i]]=i; build(1, 0, n*m); for (int i=0; i<=n; i++) for (int j=0; j<=m; j++) update(i, j, 1); //for (int i=0; i<=n*m; i++) // cout << qry(1, 0, n*m, i, i).first << ' '; //cout << '\n'; } int swap_seats(int x, int y) { int xa=a[x], xb=b[x], ya=a[y], yb=b[y]; vector<pair<int, int> > tmp; tmp.push_back({xa, xb}); tmp.push_back({xa, xb+1}); tmp.push_back({xa+1, xb}); tmp.push_back({xa+1, xb+1}); tmp.push_back({ya, yb}); tmp.push_back({ya, yb+1}); tmp.push_back({ya+1, yb}); tmp.push_back({ya+1, yb+1}); sort(tmp.begin(), tmp.end()); tmp.resize(unique(tmp.begin(), tmp.end())-tmp.begin()); for (pair<int, int> p:tmp) update(p.first, p.second, -1); //for (int i=0; i<=n*m; i++) // cout << qry(1, 0, n*m, i, i).first << ' '; //cout << '\n'; rect[xa][xb]=y; rect[ya][yb]=x; for (pair<int, int> p:tmp) update(p.first, p.second, 1); a[x]=ya, b[x]=yb, a[y]=xa, b[y]=xb; //for (int i=0; i<=n*m; i++) // cout << qry(1, 0, n*m, i, i).first << ' '; //cout << '\n'; return qry(1, 0, n*m, 0, n*m-1).second; }
#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...