This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include "seats.h"
#include <cassert>
#include <algorithm>
template<typename T> bool ckmax(T& a, const T& b) {return b>a?a=b,1:0;}
template<typename T> bool ckmin(T& a, const T& b) {return b<a?a=b,1:0;}
const int INF = 0x3f3f3f3f;
int H, W, N, ans;
std::vector<int> R, C;
//Subtasks 1, 2, 4
std::vector<int> maxr, minr, maxc, minc;
int calc(int u, int v)
{
for(int i=u;i<v;++i)
if(i+1 == (maxr[i+1]-minr[i+1])*(maxc[i+1]-minc[i+1]))
--ans;
for(int i=u;i<v;++i)
{
minr[i+1]=std::min(minr[i], R[i]);
maxr[i+1]=std::max(maxr[i], R[i]+1);
minc[i+1]=std::min(minc[i], C[i]);
maxc[i+1]=std::max(maxc[i], C[i]+1);
if(i+1 == (maxr[i+1]-minr[i+1])*(maxc[i+1]-minc[i+1]))
++ans;
}
return ans;
}
//Subtask 3
struct ST
{
public:
std::vector<int> v;
int S;
ST(int _S=0): S(_S), v(_S*4, 0) {}
void init(int _S)
{
S=_S;
v.assign(_S*4, 0);
}
void set(int n, int l, int r, int q, int val)
{
if(r-l>1)
{
int m=l+(r-l)/2;
if(q<m) set(n<<1, l, m, q, val);
else set(n<<1|1, m, r, q, val);
v[n]=std::max(v[n<<1], v[n<<1|1]);
}
else v[n]=val;
}
void set(int q, int val) {set(1, 0, S, q, val);}
int qry(int n, int l, int r, int qr)
{
if(r <= qr) return v[n];
if(r-l>1)
{
int m=l+(r-l)/2;
int f=qry(n<<1, l, m, qr);
if(m<qr) ckmax(f, qry(n<<1|1, m, r, qr));
return f;
}
assert(0);
}
int qry(int q) {return qry(1, 0, S, q);}
} mxrst, mnrst, mxcst, mncst;
int st3()
{
int f=0;
int n=1;
for(;n <= N;)
{
int sz = (mxrst.qry(n)+mnrst.qry(n))*(mxcst.qry(n)+mncst.qry(n));
if(sz == n) ++f, ++n;
else n=sz;
}
return f;
}
void give_initial_chart(int _H, int _W, std::vector<int> _R, std::vector<int> _C) {
H=_H, W=_W;
R=_R, C=_C;
N = H*W;
if(H <= 1000 && W <= 1000)
{
mxrst.init(N);
mnrst.init(N);
mxcst.init(N);
mncst.init(N);
for(int i=0;i<N;++i)
{
mxrst.set(i, R[i]+1);
mnrst.set(i, -R[i]);
mxcst.set(i, C[i]+1);
mncst.set(i, -C[i]);
}
return;
}
maxr.assign(N+1, -1);
maxc.assign(N+1, -1);
minr.assign(N+1, INF);
minc.assign(N+1, INF);
calc(0, N);
}
int swap_seats(int a, int b) {
std::swap(R[a], R[b]);
std::swap(C[a], C[b]);
if(H <= 1000 && W <= 1000)
{
for(int i:{a,b})
{
mxrst.set(i, R[i]+1);
mnrst.set(i, -R[i]);
mxcst.set(i, C[i]+1);
mncst.set(i, -C[i]);
}
return st3();
}
if(b<a) std::swap(a,b);
return calc(a, b+1);
}
Compilation message (stderr)
seats.cpp: In constructor 'ST::ST(int)':
seats.cpp:39:7: warning: 'ST::S' will be initialized after [-Wreorder]
39 | int S;
| ^
seats.cpp:38:20: warning: 'std::vector<int> ST::v' [-Wreorder]
38 | std::vector<int> v;
| ^
seats.cpp:40:3: warning: when initialized here [-Wreorder]
40 | ST(int _S=0): S(_S), v(_S*4, 0) {}
| ^~
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |