#include "seats.h"
#include<bits/stdc++.h>
#include <climits>
using namespace std;
struct node{
int mn, mx;
};
struct seg{
node f(node a, node b){
return node{min(a.mn, b.mn), max(a.mx, b.mx)};
}
int n; vector<node> t;
void build(vector<int> &a){
n = a.size(); t.resize(2*n);
for(int i = 0; i<n; i++) t[i+n] = {a[i], a[i]};
for(int i = n-1; i>0; i--) t[i] = f(t[i<<1],t[(i<<1)|1]);
return;
}
void upd(int x, int i){
for(t[i+=n] = {x, x}; i>>=1;) t[i] = f(t[i<<1], t[(i<<1)|1]);
return;
}
node q(int l, int r){
node sl = {INT_MAX, 0};
for(l+=n, r+=n; l<=r; l>>=1, r>>=1){
if(l&1) sl = f(sl, t[l++]);
if(!(r&1)) sl = f(sl, t[r--]);
}
return sl;
}
};
seg r, c;
int h, w;
void give_initial_chart(int H, int W, std::vector<int> R, std::vector<int> C) {
h = H; w = W;
r.build(R); c.build(C);
return;
}
int swap_seats(int a, int b) {
int ca = c.t[a+c.n].mn;
int cb = c.t[b+c.n].mn;
int ra = r.t[a+r.n].mn;
int rb = r.t[b+r.n].mn;
c.upd(cb, a);
c.upd(ca, b);
r.upd(rb, a);
r.upd(ra, b);
auto get_rc = [&](int i)->int{
node cc = c.q(0, i);
node rr = r.q(0, i);
return (cc.mx-cc.mn+1)*(rr.mx-rr.mn+1);
};
int sol = 0;
for(int i = 0; i<h*w; i++){
int sz = get_rc(i);
i = sz-1;
if(i+1 == get_rc(i)) sol++;
}
return sol;
}
# | 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... |