이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define pb push_back
int N;
struct segTree{
vector<int> ones,tri;
void init()
{
ones.resize(4*N);
tri.resize(4*N);
}
void prop(int i)
{
ones[2*i]+=ones[i];
ones[2*i+1]+=ones[i];
ones[i]=0;
}
void add(int qs,int qe,int x,int sta,int i=1,int l=0,int r=N-1)
{
if(r<qs||l>qe)
return;
if(qs<=l&&r<=qe)
{
if(sta==0)
ones[i]+=x;
else
tri[i]+=x;
return;
}
int m=(l+r)>>1;
prop(i);
add(qs,qe,x,sta,2*i,l,m);
add(qs,qe,x,sta,2*i+1,m+1,r);
}
bool get(int poz,int i=1,int l=0,int r=N-1)
{
if(l>poz||r<poz)
return false;
if(l==r&&poz==l)
return ones[i]<=4&&tri[i]==0;
int m=(l+r)>>1;
return get(poz,2*i,l,m)||get(poz,2*i+1,m+1,r);
}
} ST;
vector<vector<int> > mat;
int res=0;
int h,w;
void update(int x,int y,int z)
{
vector<int> val;
for(int i=0;i<2;i++)
for(int j=0;j<2;j++)
val.pb(mat[x+i][y+j]);
sort(val.begin(),val.end());
ST.add(val[0],val[1]-1,z,0);
//printf("Jedinice od %i do %i, trojke od %i do %i\n",val[0],val[1]-1,val[2],val[3]-1);
ST.add(val[2],val[3]-1,z,1);
}
vector<int> r,c;
vector<bool> sol;
void give_initial_chart(int H, int W, std::vector<int> R, std::vector<int> C) {
h=H;
w=W;
sol.resize(H*W);
mat.resize(H);
for(int i=0;i<H;i++)
mat[i].resize(W);
N=H*W;
ST.init();
for(int i=0;i<H*W;i++){
mat[R[i]][C[i]]=i;
r.pb(R[i]);
c.pb(C[i]);
}
for(int i=0;i<H-1;i++)
for(int j=0;j<W-1;j++)
update(i,j,1);
for(int i=0;i<H*W;i++)
{
if(ST.get(i)){
// printf("%i\n",i);
res++;
sol[i]=true;
}
else
sol[i]=false;
}
}
bool inside(int x,int y)
{
if(x>=0&&x<h&&y>=0&&y<w)
return true;
return false;
}
int swap_seats(int a, int b) {
for(int i=-1;i<=0;i++)
for(int j=-1;j<=0;j++)
if(inside(r[a]+i,c[a]+j))
update(r[a]+i,c[a]+j,-1);
for(int i=-1;i<=0;i++)
for(int j=-1;j<=0;j++)
if(inside(r[b]+i,c[b]+j))
update(r[b]+i,c[b]+j,-1);
swap(mat[r[a]][c[a]],mat[r[b]][c[b]]);
for(int i=-1;i<=0;i++)
for(int j=-1;j<=0;j++)
if(inside(r[a]+i,c[a]+j))
update(r[a]+i,c[a]+j,1);
for(int i=-1;i<=0;i++)
for(int j=-1;j<=0;j++)
if(inside(r[b]+i,c[b]+j))
update(r[b]+i,c[b]+j,1);
vector<int> values;
for(int i=-1;i<=0;i++)
for(int j=-1;j<=0;j++)
if(inside(r[a]+i,c[a]+j))
values.pb(mat[r[a]][c[a]]);
for(int i=-1;i<=0;i++)
for(int j=-1;j<=0;j++)
if(inside(r[b]+i,c[b]+j))
values.pb(mat[r[b]][c[b]]);
for(auto p:values)
{
bool t=ST.get(p);
if(values[t])
{
if(!t)
{
values[t]=false;
res--;
}
}
else
{
if(t)
{
values[t]=true;
res++;
}
}
}
return res;
}
# | 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... |