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<bits/stdc++.h>
#define f first
#define se second
#define pb push_back
using namespace std;
int size=0;
set<pair<int, pair<int,int> > > t;
int nsize=0;
int n,m;
int fix[10000][10000];
vector<int> adj[1002*1002];
int a[10000][10000];
void dfs(int p){
int x=p/n,y=p%n;
fix[x][y]=1;
nsize++;
if(fix[x-1][y]!=1){
size++;
}
if(fix[x+1][y]!=1){
size++;
}
if(fix[x][y-1]!=1){
size++;
}
if(fix[x][y+1]!=1){
size++;
}
t.insert({a[x+1][y],{x+1,y}});
t.insert({a[x][y-1],{x,y-1}});
t.insert({a[x][y+1],{x,y+1}});
t.insert({a[x-1][y], {x-1,y}});
fix[x-1][y]=1;
fix[x+1][y]=1;
fix[x][y-1]=1;
fix[x][y+1]=1;
for(int i=0; i<adj[p].size(); i++){
if(fix[adj[p][i]/n][adj[p][i]%n]==1){
continue;
}
dfs(adj[p][i]);
}
}
int main(){
cin>>n>>m;
int r[n][m];
for(int i=0; i<n; i++){
for (int j=0; j<m; j++){
cin>>a[i][j];
r[i][j]=0;
fix[i][j]=0;
}
}
int k;
cin>>k;
pair<int,int> c[k];
for(int i=0; i<k; i++){
cin>>c[i].f>>c[i].se;
r[c[i].f][c[i].se]=1;
}
int pas=0;
pair<int,int> d[8]={{1,1}, {1,0}, {1,-1}, {0,1}, {0, -1}, {-1,1}, {-1, 0}, {-1,-1}};
for(int i=0; i<n; i++){
for(int j=0; j<m; j++){
int p=0;
for(int ii=0; ii<8; ii++){
int x=i+d[ii].f;
int y=j+d[ii].se;
if(r[i][j]==1 && r[x][y]==1){
p++;
if(i+1>=n || i-1<0 || j-1<0 || j+1>=m || x+1>=n || x-1<0 || y-1<0 || y+1>=m){
cout<<"No"<<endl;
return 0;
}
fix[i][j]=1;
fix[i+1][j]=1;
fix [i-1][j]=1;
fix[i][j-1]=1;
fix[i][j+1]=1;
fix[x][y]=1;
fix[x+1][y]=1;
fix[x-1][y]=1;
fix[x][y-1]=1;
fix[x][y+1]=1;
}
}
if(p>1){
cout<<"No"<<endl;
return 0;
}
}
}
for(int asd=0; asd<k; asd++){
for(int i=0; i<k; i++){
int x=c[i].f,y=c[i].se;
if(fix[x][y]==1){
continue;
}
int bruh=4;
bool left=true,right=true,up=true,down=true;
if(x+1>=n){
bruh--;
up=false;
}else if(fix[x+1][y]==1 || r[x+1][y]==1){
bruh--;
up=false;
}
if(x-1<0){
bruh--;
down=false;
}else if(fix[x-1][y]==1 || r[x-1][y]==1){
bruh--;
down=false;
}
if(y-1<0){
bruh--;
left=false;
}else if(fix[x][y-1]==1 || r[x][y-1]==1){
bruh--;
left=false;
}
if( y+1>=m){
bruh--;
right=false;
}else if(fix[x][y+1]==1 || r[x][y+1]==1){
bruh--;
right=false;
}
if(bruh==3){
fix[x][y]=1;
if(up==true){
fix[x+1][y]=1;
}
if(down==true){
fix[x-1][y]=1;
}
if(left==true){
fix[x][y-1]=1;
}
if(right==true){
fix[x][y+1]=1;
}
}
if(bruh<3){
cout<<"No";
return 0;
}
if(bruh==4){
r[x][y]=2;
}
}
}
for(int i=0; i<n; i++){
for(int j=0; j<m; j++){
if(r[i][j]!=2){
continue;
}
if(i+2<n){
if(r[i+2][j]==2){
adj[i*n+j].pb((i+2)*n+j);
}
}
if(i-2>=0){
if(r[i-2][j]==2){
adj[i*n+j].pb((i-2)*n+j);
}
}
if(j+2<m){
if(r[i][j+2]==2){
adj[i*n+j].pb((i)*n+j+2);
}
}
if(j-2>=0){
if(r[i][j-2]==2){
adj[i*n+j].pb((i)*n+j-2);
}
}
}
}
for(int i=0; i<n; i++){
for(int j=0; j<m; j++){
if(fix[i][j]==0 && r[i][j]==2 ){
dfs({i*n+j});
if(size==3*nsize+1 && t.size()>0){
pair<int,pair<int,int> > d=*t.begin();
fix[d.se.f][d.se.se]=0;
}
if(size<3*nsize){
cout<<"No"<<endl;
return 0;
}
t.clear();
nsize=0;
size=0;
}
}
}
for(int i=0; i<n; i++){
for(int j=0; j<m; j++){
if(fix[i][j]==1 ){
pas+=a[i][j];
}
}
}
cout<<pas;
}
Compilation message (stderr)
covering.cpp: In function 'void dfs(int)':
covering.cpp:44:16: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
44 | for(int i=0; i<adj[p].size(); i++){
| ~^~~~~~~~~~~~~~
# | 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... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |