#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define pb push_back
int N;
struct segTree{
vector<int> ones,tri;
vector<int> sum;
vector<pair<int,int> > minn;
vector<int> num;
void set(int i,int l,int r)
{
num[i]=r-l+1;
if(l==r)
return;
int m=(l+r)>>1;
set(2*i,l,m);
set(2*i+1,m+1,r);
}
void init()
{
ones.resize(4*N);
tri.resize(4*N);
minn.resize(4*N);
num.resize(4*N);
set(1,0,N-1);
}
void prop(int i)
{
if(ones[i]!=0){
ones[2*i]+=ones[i];
minn[2*i].first+=ones[i];
ones[2*i+1]+=ones[i];
minn[2*i+1].first+=ones[i];
ones[i]=0;
}
if(tri[i]!=0)
{
tri[2*i]+=tri[i];
minn[2*i].second+=tri[i];
tri[2*i+1]+=tri[i];
minn[2*i+1].second+=tri[i];
tri[i]=0;
}
}
void update(int i)
{
if(minn[2*i]==minn[2*i+1])
{
minn[i]=minn[2*i];
num[i]=num[2*i]+num[2*i+1];
return;
}
if(minn[2*i]<minn[2*i+1])
{
minn[i]=minn[2*i];
num[i]=num[2*i];
return;
}
if(minn[2*i]>minn[2*i+1])
{
minn[i]=minn[2*i+1];
num[i]=num[2*i+1];
}
}
void nope(int qs,int qe,int x,int sta,int i=1,int l=0,int r=N-1)
{
if(qe<qs)
return;
if(r<qs||l>qe)
return;
if(qs<=l&&r<=qe)
{
//printf("Dodajem %i %i od %i do %i %i\n",x,sta,l,r,i);
if(sta==0){
ones[i]+=x;
//minn[i].first+=x;
}
else{
tri[i]+=x;
//minn[i].second+=x;
}
return;
}
int m=(l+r)>>1;
nope(qs,qe,x,sta,2*i,l,m);
nope(qs,qe,x,sta,2*i+1,m+1,r);
}
void update_all(int i=1,int l=0,int r=N-1)
{
if(l==r){
minn[i].first+=ones[i];
minn[i].second+=tri[i];
//printf("%i: %i %i\n",l,minn[i].first,minn[i].second);
return;
}
int m=(l+r)>>1;
ones[2*i]+=ones[i];
ones[2*i+1]+=ones[i];
ones[i]=0;
tri[2*i]+=tri[i];
tri[2*i+1]+=tri[i];
tri[i]=0;
update_all(2*i,l,m);
update_all(2*i+1,m+1,r);
update(i);
}
void add(int qs,int qe,int x,int sta,int i=1,int l=0,int r=N-1)
{
//printf("%i %i %i %i %i %i %i\n",qs,qe,x,sta,i,l,r);
if(qe<qs)
return;
if(r<qs||l>qe)
return;
if(qs<=l&&r<=qe)
{
if(sta==0){
ones[i]+=x;
minn[i].first+=x;
}
else{
tri[i]+=x;
minn[i].second+=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);
update(i);
}
int get()
{
//printf("%i %i\n",minn[1].first,minn[1].second);
if(minn[1]==make_pair(4,0))
return num[1];
return 0;
}
} ST;
vector<vector<int> > mat;
int h,w;
bool inside(int x,int y)
{
if(x>=0&&x<h&&y>=0&&y<w)
return true;
return false;
}
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++)
if(inside(x+i,y+j))
val.pb(mat[x+i][y+j]);
sort(val.begin(),val.end());
if(val.size()==4)
{
ST.add(val[0],val[1]-1,z,0);
ST.add(val[2],val[3]-1,z,1);
return;
//printf("Dodajem 1 od %i do %i, dodajem 3 od %i do %i\n",val[0],val[1]-1,val[2],val[3]-1);
}
if(val.size()==3)
{
assert(0);
}
if(val.size()==2)
{
ST.add(val[0],val[1]-1,z,0);
return;
//printf("Dodajem 1 od %i do %i\n",val[0],val[1]-1);
}
if(val.size()==1)
{
ST.add(val[0],N-1,z,0);
//printf("Dodajem 1 od %i do %i\n",val[0],N-1);
}
}
vector<int> r,c;
vector<bool> sol;
int get(int x,int y)
{
if(inside(x,y))
return mat[x][y];
return N;
}
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;i++)
{
for(int j=0;j<W;j++)
{
int tr=mat[i][j];
//printf("%i\n",tr);
int up=get(i-1,j);
int down=get(i+1,j);
int left=get(i,j-1);
int right=get(i,j+1);
//printf("%i %i %i %i\n",up,down,left,right);
int tr2=(get(i-1,j-1)<tr)+(up<tr)+(left<tr);
if(tr2==0)
{
ST.nope(tr,min((int)get(i-1,j-1),min(up,left))-1,1,0);
}
if(tr2==2)
{
ST.nope(tr,max((int)get(i-1,j-1),max(up,left))-1,1,1);
}
tr2=(get(i-1,j+1)<tr)+(up<tr)+(right<tr);
if(tr2==0)
{
ST.nope(tr,min((int)get(i-1,j+1),min(up,right))-1,1,0);
}
if(tr2==2)
{
ST.nope(tr,max((int)get(i-1,j+1),max(up,right))-1,1,1);
}
tr2=(get(i+1,j+1)<tr)+(down<tr)+(right<tr);
if(tr2==0)
{
ST.nope(tr,min((int)get(i+1,j+1),min(down,right))-1,1,0);
}
if(tr2==2)
{
ST.nope(tr,max((int)get(i+1,j+1),max(down,right))-1,1,1);
}
tr2=(get(i+1,j-1)<tr)+(down<tr)+(left<tr);
if(tr2==0)
{
ST.nope(tr,min((int)get(i+1,j-1),min(down,left))-1,1,0);
}
if(tr2==2)
{
ST.nope(tr,max((int)get(i+1,j-1),max(down,left))-1,1,1);
}
}
}
ST.update_all();
/*for(int i=-1;i<H;i++)
for(int j=-1;j<W;j++)
update(i,j,1);*/
//printf("%i\n",ST.get());
}
int swap_seats(int a, int b) {
//printf("%i %i %i %i\n",r[a],c[a],r[b],c[b]);
for(int i=-1;i<=0;i++)
for(int j=-1;j<=0;j++)
update(r[a]+i,c[a]+j,-1);
for(int i=-1;i<=0;i++)
for(int j=-1;j<=0;j++)
update(r[b]+i,c[b]+j,-1);
//printf("Cmon!\n");
swap(mat[r[a]][c[a]],mat[r[b]][c[b]]);
swap(r[a],r[b]);
swap(c[a],c[b]);
/*for(int i=0;i<h;i++)
{
for(int j=0;j<w;j++)
printf("%i ",mat[i][j]);
printf("\n");
}*/
for(int i=-1;i<=0;i++)
for(int j=-1;j<=0;j++)
update(r[a]+i,c[a]+j,1);
for(int i=-1;i<=0;i++)
for(int j=-1;j<=0;j++)
update(r[b]+i,c[b]+j,1);
return ST.get();
}
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
27 ms |
376 KB |
Output is correct |
2 |
Correct |
67 ms |
628 KB |
Output is correct |
3 |
Correct |
92 ms |
628 KB |
Output is correct |
4 |
Correct |
30 ms |
628 KB |
Output is correct |
5 |
Correct |
37 ms |
656 KB |
Output is correct |
6 |
Correct |
45 ms |
656 KB |
Output is correct |
7 |
Correct |
51 ms |
656 KB |
Output is correct |
8 |
Correct |
49 ms |
656 KB |
Output is correct |
9 |
Correct |
49 ms |
656 KB |
Output is correct |
10 |
Correct |
49 ms |
656 KB |
Output is correct |
11 |
Correct |
46 ms |
656 KB |
Output is correct |
12 |
Correct |
27 ms |
656 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
27 ms |
376 KB |
Output is correct |
2 |
Correct |
67 ms |
628 KB |
Output is correct |
3 |
Correct |
92 ms |
628 KB |
Output is correct |
4 |
Correct |
30 ms |
628 KB |
Output is correct |
5 |
Correct |
37 ms |
656 KB |
Output is correct |
6 |
Correct |
45 ms |
656 KB |
Output is correct |
7 |
Correct |
51 ms |
656 KB |
Output is correct |
8 |
Correct |
49 ms |
656 KB |
Output is correct |
9 |
Correct |
49 ms |
656 KB |
Output is correct |
10 |
Correct |
49 ms |
656 KB |
Output is correct |
11 |
Correct |
46 ms |
656 KB |
Output is correct |
12 |
Correct |
27 ms |
656 KB |
Output is correct |
13 |
Correct |
113 ms |
1760 KB |
Output is correct |
14 |
Correct |
120 ms |
1760 KB |
Output is correct |
15 |
Correct |
60 ms |
1760 KB |
Output is correct |
16 |
Correct |
46 ms |
2216 KB |
Output is correct |
17 |
Correct |
81 ms |
2216 KB |
Output is correct |
18 |
Correct |
98 ms |
2216 KB |
Output is correct |
19 |
Correct |
76 ms |
2216 KB |
Output is correct |
20 |
Correct |
63 ms |
2216 KB |
Output is correct |
21 |
Correct |
50 ms |
2216 KB |
Output is correct |
22 |
Correct |
47 ms |
2292 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1697 ms |
106820 KB |
Output is correct |
2 |
Correct |
972 ms |
106820 KB |
Output is correct |
3 |
Correct |
929 ms |
106820 KB |
Output is correct |
4 |
Correct |
815 ms |
106820 KB |
Output is correct |
5 |
Correct |
853 ms |
106820 KB |
Output is correct |
6 |
Correct |
792 ms |
106820 KB |
Output is correct |
7 |
Correct |
862 ms |
106836 KB |
Output is correct |
8 |
Correct |
975 ms |
106836 KB |
Output is correct |
9 |
Correct |
912 ms |
106836 KB |
Output is correct |
10 |
Correct |
975 ms |
106836 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
102 ms |
106836 KB |
Output is correct |
2 |
Correct |
191 ms |
106836 KB |
Output is correct |
3 |
Correct |
831 ms |
106836 KB |
Output is correct |
4 |
Correct |
1688 ms |
106836 KB |
Output is correct |
5 |
Correct |
767 ms |
106884 KB |
Output is correct |
6 |
Correct |
1755 ms |
157564 KB |
Output is correct |
7 |
Correct |
828 ms |
157564 KB |
Output is correct |
8 |
Correct |
952 ms |
157564 KB |
Output is correct |
9 |
Correct |
955 ms |
157564 KB |
Output is correct |
10 |
Correct |
951 ms |
157564 KB |
Output is correct |
11 |
Correct |
844 ms |
157564 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
132 ms |
157564 KB |
Output is correct |
2 |
Correct |
200 ms |
157564 KB |
Output is correct |
3 |
Correct |
265 ms |
157564 KB |
Output is correct |
4 |
Correct |
354 ms |
157564 KB |
Output is correct |
5 |
Correct |
526 ms |
157564 KB |
Output is correct |
6 |
Correct |
1366 ms |
157564 KB |
Output is correct |
7 |
Correct |
1582 ms |
157564 KB |
Output is correct |
8 |
Correct |
1354 ms |
157564 KB |
Output is correct |
9 |
Correct |
2214 ms |
157564 KB |
Output is correct |
10 |
Correct |
1516 ms |
157564 KB |
Output is correct |
11 |
Correct |
1252 ms |
157564 KB |
Output is correct |
12 |
Correct |
1278 ms |
157564 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
27 ms |
376 KB |
Output is correct |
2 |
Correct |
67 ms |
628 KB |
Output is correct |
3 |
Correct |
92 ms |
628 KB |
Output is correct |
4 |
Correct |
30 ms |
628 KB |
Output is correct |
5 |
Correct |
37 ms |
656 KB |
Output is correct |
6 |
Correct |
45 ms |
656 KB |
Output is correct |
7 |
Correct |
51 ms |
656 KB |
Output is correct |
8 |
Correct |
49 ms |
656 KB |
Output is correct |
9 |
Correct |
49 ms |
656 KB |
Output is correct |
10 |
Correct |
49 ms |
656 KB |
Output is correct |
11 |
Correct |
46 ms |
656 KB |
Output is correct |
12 |
Correct |
27 ms |
656 KB |
Output is correct |
13 |
Correct |
113 ms |
1760 KB |
Output is correct |
14 |
Correct |
120 ms |
1760 KB |
Output is correct |
15 |
Correct |
60 ms |
1760 KB |
Output is correct |
16 |
Correct |
46 ms |
2216 KB |
Output is correct |
17 |
Correct |
81 ms |
2216 KB |
Output is correct |
18 |
Correct |
98 ms |
2216 KB |
Output is correct |
19 |
Correct |
76 ms |
2216 KB |
Output is correct |
20 |
Correct |
63 ms |
2216 KB |
Output is correct |
21 |
Correct |
50 ms |
2216 KB |
Output is correct |
22 |
Correct |
47 ms |
2292 KB |
Output is correct |
23 |
Correct |
1697 ms |
106820 KB |
Output is correct |
24 |
Correct |
972 ms |
106820 KB |
Output is correct |
25 |
Correct |
929 ms |
106820 KB |
Output is correct |
26 |
Correct |
815 ms |
106820 KB |
Output is correct |
27 |
Correct |
853 ms |
106820 KB |
Output is correct |
28 |
Correct |
792 ms |
106820 KB |
Output is correct |
29 |
Correct |
862 ms |
106836 KB |
Output is correct |
30 |
Correct |
975 ms |
106836 KB |
Output is correct |
31 |
Correct |
912 ms |
106836 KB |
Output is correct |
32 |
Correct |
975 ms |
106836 KB |
Output is correct |
33 |
Correct |
102 ms |
106836 KB |
Output is correct |
34 |
Correct |
191 ms |
106836 KB |
Output is correct |
35 |
Correct |
831 ms |
106836 KB |
Output is correct |
36 |
Correct |
1688 ms |
106836 KB |
Output is correct |
37 |
Correct |
767 ms |
106884 KB |
Output is correct |
38 |
Correct |
1755 ms |
157564 KB |
Output is correct |
39 |
Correct |
828 ms |
157564 KB |
Output is correct |
40 |
Correct |
952 ms |
157564 KB |
Output is correct |
41 |
Correct |
955 ms |
157564 KB |
Output is correct |
42 |
Correct |
951 ms |
157564 KB |
Output is correct |
43 |
Correct |
844 ms |
157564 KB |
Output is correct |
44 |
Correct |
132 ms |
157564 KB |
Output is correct |
45 |
Correct |
200 ms |
157564 KB |
Output is correct |
46 |
Correct |
265 ms |
157564 KB |
Output is correct |
47 |
Correct |
354 ms |
157564 KB |
Output is correct |
48 |
Correct |
526 ms |
157564 KB |
Output is correct |
49 |
Correct |
1366 ms |
157564 KB |
Output is correct |
50 |
Correct |
1582 ms |
157564 KB |
Output is correct |
51 |
Correct |
1354 ms |
157564 KB |
Output is correct |
52 |
Correct |
2214 ms |
157564 KB |
Output is correct |
53 |
Correct |
1516 ms |
157564 KB |
Output is correct |
54 |
Correct |
1252 ms |
157564 KB |
Output is correct |
55 |
Correct |
1278 ms |
157564 KB |
Output is correct |
56 |
Correct |
259 ms |
157564 KB |
Output is correct |
57 |
Correct |
549 ms |
157564 KB |
Output is correct |
58 |
Correct |
760 ms |
157564 KB |
Output is correct |
59 |
Correct |
2145 ms |
157564 KB |
Output is correct |
60 |
Correct |
3586 ms |
157564 KB |
Output is correct |
61 |
Correct |
1964 ms |
157564 KB |
Output is correct |
62 |
Correct |
1619 ms |
157564 KB |
Output is correct |
63 |
Correct |
3350 ms |
157564 KB |
Output is correct |
64 |
Correct |
2349 ms |
157564 KB |
Output is correct |
65 |
Correct |
1931 ms |
157564 KB |
Output is correct |
66 |
Correct |
2206 ms |
157564 KB |
Output is correct |
67 |
Correct |
2197 ms |
157564 KB |
Output is correct |
68 |
Correct |
1686 ms |
157564 KB |
Output is correct |
69 |
Correct |
3260 ms |
157564 KB |
Output is correct |