제출 #1016935

#제출 시각아이디문제언어결과실행 시간메모리
1016935Drake바이러스 (JOI19_virus)C++17
100 / 100
162 ms27988 KiB
#include<bits/stdc++.h> using namespace std; #define int long long #define F first #define S second #define all(x) x.begin(),x.end() #define pii pair<int,int> #define pb push_back #define sz(x) (int)(x.size()) #define chmin(x,y) x=min(x,y) #define chmax(x,y) x=max(x,y) #define vi vector<int> #define vp vector<pii> #define vvi vector<vi> #define ykh mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count()) #define __lg(x) 63-__builtin_clzll(x) #define pow2(x) (1LL<<x) void __print(int x) {cerr << x;} void __print(float x) {cerr << x;} void __print(double x) {cerr << x;} void __print(long double x) {cerr << x;} void __print(char x) {cerr << '\'' << x << '\'';} void __print(const char *x) {cerr << '\"' << x << '\"';} void __print(const string &x) {cerr << '\"' << x << '\"';} void __print(bool x) {cerr << (x ? "true" : "false");} template<typename T, typename V> void __print(const pair<T, V> &x) {cerr << '{'; __print(x.first); cerr << ','; __print(x.second); cerr << '}';} template<typename T> void __print(const T &x) {int f = 0; cerr << '{'; for (auto &i: x) cerr << (f++ ? "," : ""), __print(i); cerr << "}";} void _print() {cerr << "]\n";} template <typename T, typename... V> void _print(T t, V... v) {__print(t); if (sizeof...(v)) cerr << ", "; _print(v...);} void setIO(string s) { freopen((s + ".in").c_str(), "r", stdin); freopen((s + ".out").c_str(), "w", stdout); } #ifdef local void CHECK(); void setio(){ freopen("/Users/iantsai/cpp/input.txt","r",stdin); freopen("/Users/iantsai/cpp/output.txt","w",stdout); } #define debug(x...) cerr << "[" << #x << "] = ["; _print(x) #else void setio(){} #define debug(x...) #endif #define TOI_is_so_de ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);setio(); const int mxn = 1e5+5, inf = 1e18, mxc = 805; int w[2*mxn]; vector<pii>dir = {{-1, 0}, {0, 1}, {0, -1}, {1, 0}}; int t, n, m, mxw = 0, mxe = 0, v[mxc][mxc], len[16], to[mxc*mxc], num[mxc*mxc], col[mxc][mxc], cur, an[mxc][mxc]; bool owo[mxc*mxc]; int find(int x){ return x == to[x] ? x : to[x] = find(to[x]); } void merge(int x, int y){ x = find(x); y = find(y); if(x == y) return ; num[y] += num[x]; to[x] = y; } bool check(int x, int y){ if(v[x][y] == 0) return 0; int mask = 0, i = 0; for(auto [dx, dy] : dir){ int nx = x + dx; int ny = y + dy; if(col[nx][ny] == cur) mask |= (1 << i); i++; } return len[mask] >= v[x][y]; } bool bfs(int sx, int sy){ queue<pair<int,int>> q; q.push({sx, sy}); int sid = sx*m+sy, cnt = 0; col[sx][sy] = ++cur; while(sz(q)){ auto [nx, ny] = q.front(); //debug(nx, ny); q.pop(); cnt++; int nid = nx*m+ny; if(find(nid) != find(sid)) { merge(sid, nid); return 1; } for(auto [dx, dy] : dir){ int x = nx + dx; int y = ny + dy; if(!(1 <= x and x <= n and 1 <= y and y <= m)) continue; if(col[x][y] == col[sx][sy]) continue; if(!check(x, y)) continue; col[x][y] = col[sx][sy]; q.push({x, y}); } } //debug('\n'); an[sx][sy] = cnt; return 0; } signed main(){ TOI_is_so_de; cin >> t >> n >> m; for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ num[i*m+j] = 1; to[i*m+j] = i*m+j; owo[i*m+j] = 1; an[i][j] = inf; } } for(int i=1;i<=t;i++){ char c; cin >> c; if(c == 'W'){ w[i] = 2; } else if(c == 'N'){ w[i] = 0; } else if(c == 'E'){ w[i] = 1; } else { w[i] = 3; } w[i+t] = w[i]; } int cnt = 0; for(int i = 0; i < 16; i++){ cnt = 0; for(int j = 1; j <= 2*t; j++){ if(i >> w[j] & 1){ chmax(len[i], ++cnt); } else{ cnt = 0; } } if(len[i] == 2*t) len[i] = inf; } for(int i = 1; i <= n; i++){ for(int j = 1; j <= m; j++){ cin >> v[i][j]; } } /*for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ cerr << find(i*m+j) << ' '; } cerr << '\n'; } cerr << '\n';*/ while(1){ bool flag = 0; for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ if(v[i][j] == 0) continue; int id = i*m+j; if(to[id] != id) continue; if(owo[id] == 0) continue; flag |= bfs(i, j); } } /*for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ cerr << find(i*m+j) << ' '; } cerr << '\n'; } cerr << '\n';*/ if(!flag) break; } int ans = inf; cnt = 0; for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ int id = i*m+j; if(to[id] != id or v[i][j] == 0) continue; bfs(i, j); //cerr << to[id] << ',' << id << ',' << an[i][j] << ' '; if(ans > an[i][j]){ ans = an[i][j]; cnt = an[i][j]; } else if(ans == an[i][j]){ cnt += an[i][j]; } } //cerr << '\n'; } cout << ans << '\n' << cnt << '\n'; #ifdef local CHECK(); #endif } /* input: */ #ifdef local void CHECK(){ cerr << "\n[Time]: " << 1000.0 * clock() / CLOCKS_PER_SEC << " ms.\n"; function<bool(string,string)> compareFiles = [](string p1, string p2)->bool { std::ifstream file1(p1); std::ifstream file2(p2); if (!file1.is_open() || !file2.is_open())return false; std::string line1, line2; while (getline(file1, line1) && getline(file2, line2)) { if (line1 != line2)return false; } int cnta=0,cntb=0; while(getline(file1,line1))cnta++; while(getline(file2,line2))cntb++; return cntb-cnta<=1; }; bool check = compareFiles("output.txt","expected.txt"); if (check) cerr<<"ACCEPTED\n"; else cerr<<"WRONG ANSWER!\n"; } #else #endif

컴파일 시 표준 에러 (stderr) 메시지

virus.cpp: In function 'void setIO(std::string)':
virus.cpp:35:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   35 |     freopen((s + ".in").c_str(), "r", stdin);
      |     ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
virus.cpp:36:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   36 |     freopen((s + ".out").c_str(), "w", stdout);
      |     ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...