이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include<bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/trie_policy.hpp>
#define pb push_back
#define mp make_pair
#define taskname "A"
using namespace std;
using namespace __gnu_pbds;
typedef long long ll;
typedef long double ld;
typedef pair<int,int> ii;
typedef tree <int,null_type,less<int>,rb_tree_tag,tree_order_statistics_node_update> ordered_set;
const int maxn = 800 + 5;
const int logn = log2(maxn) + 1;
int lab[maxn * maxn];
int par[maxn * maxn];
bool ok[maxn][maxn];
int a[maxn][maxn];
int best[16];
int vis[maxn][maxn];
int n , m , k;
string s;
int dx[] = {-1 , 1 , 0 , 0};
int dy[] = {0 , 0 , -1 ,1};
int to2d(int x , int y){
return x * n + y;
}
bool valid(int x , int y){
if(x < 0 || y < 0 || x >= m || y >= n)return 0;
return a[x][y] > 0;
}
int FindLab(int u){
return lab[u] < 0 ? u : lab[u] = FindLab(lab[u]);
}
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
if(fopen(taskname".INP","r")){
freopen(taskname".INP", "r",stdin);
freopen(taskname".OUT", "w",stdout);
}
{
cin >> k >> m >> n >> s;
for(auto & c : s){
if(c == 'N')c = 0;
else if(c == 'S')c = 1;
else if(c == 'W')c = 2;
else c = 3;
}
for(int i = 0 ; i < m ; ++i)for(int j = 0 ; j < n ; ++j)cin >> a[i][j];
}
{
for(int msk = 0 ; msk < 16 ; ++msk){
int j = -1;
for(int i = 0 ; i < 2 * k ; ++i){
if(msk & (1 << s[i % k]))best[msk] = max(best[msk] , i - j);
else j = i;
}
if(best[msk] >= k)best[msk] = 1e9;
}
}
{
int nTime = 0;
for(int i = 0 ; i < m * n ; ++i)lab[i] = -1 , par[i] = i;
bool flag = 0;
ii res = mp(1e9,0);
do{
flag = 0;
queue<ii> q;
for(int i = 0 ; i < m ; ++i){
for(int j = 0 ; j < n ; ++j){
if(a[i][j] > 0 && ok[i][j] == 0 && par[FindLab(to2d(i , j))] == to2d(i,j)){
int cur_lab = FindLab(to2d(i,j));
flag = 1;
while(q.size())q.pop();
q.push(mp(i,j));
vis[i][j] = ++nTime;
ii other = mp(-1 , -1);
int sum = 0;
while(q.size()){
auto u = q.front();q.pop();sum++;
for(int t = 0 ; t < 4 ; ++t){
int x = u.first + dx[t] , y = u.second + dy[t];
if(!valid(x , y) || vis[x][y] == nTime)continue;
int msk = 0;
for(int tt = 0 ; tt < 4 ; ++tt){
if(valid(x + dx[tt] , y + dy[tt]) && vis[x + dx[tt]][y + dy[tt]] == nTime){
msk |= (1 << tt);
}
}
if(best[msk] >= a[x][y]){
if(FindLab(to2d(x,y)) != cur_lab){
other = mp(x,y);
break;
}else{
q.push(mp(x,y));
vis[x][y] = nTime;
}
}
}
if(other != mp(-1,-1))break;
}
ok[i][j] = 1;
if(other == mp(-1,-1)){
if(res.first > sum)res = mp(sum,sum);
else if(res.first == sum)res.second += sum;
}else {
int tmp = FindLab(to2d(other.first,other.second));
int tmp1 = par[tmp];
if(ok[tmp1 / n][tmp1 % n] == 0){
if(lab[tmp] < lab[cur_lab]){
lab[tmp] += lab[cur_lab];
lab[cur_lab] = tmp;
}else{
lab[cur_lab] += lab[tmp];
lab[tmp] = cur_lab;
par[cur_lab] = tmp1;
}
}
}
}
}
}
}while(flag);
cout << res.first << " " << res.second << endl;
}
}
컴파일 시 표준 에러 (stderr) 메시지
virus.cpp: In function 'int main()':
virus.cpp:50:10: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)', declared with attribute warn_unused_result [-Wunused-result]
freopen(taskname".INP", "r",stdin);
~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~
virus.cpp:51:10: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)', declared with attribute warn_unused_result [-Wunused-result]
freopen(taskname".OUT", "w",stdout);
~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |