제출 #1326187

#제출 시각아이디문제언어결과실행 시간메모리
1326187joacruFurniture (JOI20_furniture)C++20
100 / 100
571 ms14340 KiB
#include <iostream> #include <algorithm> #include <vector> #define forn(i,n) for(int i=0;i<(int)n;++i) #define DBG(a) cerr<<#a<<" = "<<a<<endl #define DBGA(a) cerr<<#a<<" = "<<a<<", "; #define DBG2(a,b) do{DBGA(a)DBG(b);}while(0) #define DBG3(a,b,c) do{DBGA(a)DBGA(b)DBG(c);}while(0) #define DBG4(a,b,c,d) do{DBGA(a)DBGA(b)DBGA(c)DBG(d);}while(0) #define SZ(v) (int)v.size() using namespace std; template<typename T> ostream &operator<<(ostream &os, vector<T> &v){ os<<"["; forn(i,SZ(v)){ if(i) os<<", "; os<<v[i]; } os<<"]"; return os; } const int MAXNM = 1005, DIR = 2; vector<pair<int,int>> rd = {{0, 1}, {1, 0}}; vector<pair<int,int>> ul = {{-1, 0}, {0, -1}}; typedef vector<vector<int>> Matrix; int n, m; Matrix grid, cnt1, cnt2, tch; bool valid(int r, int c){ return r>=0&&r<n&&c>=0&&c<m; } void erase(int r, int c, vector<pair<int,int>> &v, vector<vector<int>> &cnt){ if(cnt[r][c] == 0) return; --cnt[r][c]; //~ DBG2(r, c); if(cnt[r][c]) return; forn(i, SZ(v)){ int nr = r + v[i].first; int nc = c + v[i].second; //~ DBG2(nr, nc); if(!valid(nr, nc)) continue; if(grid[nr][nc]) continue; //~ --cnt[nr][nc]; erase(nr, nc, v, cnt); } } void erase(int r, int c){ //~ cnt1[r][c] = 0; //~ cnt2[r][c] = 0; //~ DBG("erase 1"); if(cnt1[r][c]) cnt1[r][c] = 1; erase(r, c, rd, cnt1); //~ DBG("erase 2"); if(cnt2[r][c]) cnt2[r][c] = 1; erase(r, c, ul, cnt2); } void add(int r, int c, vector<pair<int,int>> &v, vector<vector<int>> &cnt){ for(auto x: v){ int nr = r + x.first; int nc = c + x.second; if(!valid(nr,nc)) continue; if(grid[nr][nc]) continue; ++cnt[nr][nc]; } } void add1(int r, int c){ add(r, c, rd, cnt1); } void add2(int r, int c){ add(r, c, ul, cnt2); } void solve(){ cin>>n>>m; grid = Matrix(n, vector<int>(m)); cnt1 = Matrix(n, vector<int>(m)); cnt2 = Matrix(n, vector<int>(m)); forn(i,n) forn(j,m) cin>>grid[i][j]; cnt1[0][0] = 1; cnt2[n-1][m-1] = 1; forn(i,n) forn(j,m){ if(grid[i][j]) continue; if(!cnt1[i][j]) continue; add1(i, j); } for(int i=n-1;i>=0;--i) for(int j=m-1;j>=0;--j){ if(grid[i][j]) continue; if(!cnt2[i][j]) continue; add2(i, j); } //~ DBG(cnt1); //~ DBG(cnt2); int q; cin>>q; while(q--){ int r, c; cin>>r>>c; --r, --c; // comprobar la diagonal if(cnt1[r][c] && cnt2[r][c]){ // candidato int x = min(c, n-r-1); int i = r+x, j = c-x; //~ DBG3(i,j,x); x = 0; while(i >= 0 && j < m){ if(cnt1[i][j] && cnt2[i][j]) ++x; --i, ++j; } //~ DBG3(i,j,x); if(x == 1){ // solo yo cout<<"0\n"; } else{ erase(r, c); cout<<"1\n"; } } else{ erase(r, c); cout<<"1\n"; } //~ DBG(cnt1); //~ DBG(cnt2); //~ DBG("============"); } cerr<<"==="<<endl; } int main(){ ios_base::sync_with_stdio(0); cin.tie(0); #ifdef LOCAL freopen("input.in", "r", stdin); int tcs; cin>>tcs; while(tcs--) #endif solve(); return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...