제출 #919702

#제출 시각아이디문제언어결과실행 시간메모리
919702PieArmyTracks in the Snow (BOI13_tracks)C++17
100 / 100
1227 ms317600 KiB
typedef long long ll;
ll pie(ll army){return (1ll<<army);}
#include <bits/stdc++.h>
#define fr first
#define sc second
#define pb push_back
#define endl '\n';
const ll inf=2000000000000000005;
using namespace std;
ll fpow(ll x,ll y,ll m=0){if(y<0){cout<<"powError";return -1;}if(m)x%=m;ll res=1;while(y>0){if(y&1)res*=x;x*=x;if(m){x%=m;res%=m;}y>>=1;}return res;}

void code(){
    int n,m;cin>>n>>m;
    vector<vector<int>>team(n,vector<int>(m,-1));
    char arr[n][m];for(auto &a:arr)for(char &x:a)cin>>x;
    queue<int>q;
    int las=0;
    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            if(arr[i][j]=='.')continue;
            if(team[i][j]!=-1)continue;
            char tur=arr[i][j];
            q.push(i*m+j);
            team[i][j]=las;
            while(q.size()){
                int pos=q.front();
                q.pop();
                int x=pos/m,y=pos%m;
                if(x+1!=n&&arr[x+1][y]==tur&&team[x+1][y]==-1){
                    team[x+1][y]=team[x][y];
                    q.push(pos+m);
                }
                if(x&&arr[x-1][y]==tur&&team[x-1][y]==-1){
                    team[x-1][y]=team[x][y];
                    q.push(pos-m);
                }
                if(y+1!=m&&arr[x][y+1]==tur&&team[x][y+1]==-1){
                    team[x][y+1]=team[x][y];
                    q.push(pos+1);
                }
                if(y&&arr[x][y-1]==tur&&team[x][y-1]==-1){
                    team[x][y-1]=team[x][y];
                    q.push(pos-1);
                }
            }
            las++;
        }
    }
    vector<vector<int>>komsu(las,vector<int>(0));
    for(int i=0;i<n;i++){
        for(int j=0;j<m-1;j++){
            if(arr[i][j]=='.'||arr[i][j+1]=='.'||team[i][j]==team[i][j+1])continue;
            komsu[team[i][j]].pb(team[i][j+1]);
            komsu[team[i][j+1]].pb(team[i][j]);
        }
    }
    for(int i=0;i<n-1;i++){
        for(int j=0;j<m;j++){
            if(arr[i][j]=='.'||arr[i+1][j]=='.'||team[i][j]==team[i+1][j])continue;
            komsu[team[i][j]].pb(team[i+1][j]);
            komsu[team[i+1][j]].pb(team[i][j]);
        }
    }
    int ans=0;
    vector<int>vis(las,0);
    vis[team[0][0]]=1;
    q.push(team[0][0]);
    while(q.size()){
        int pos=q.front();
        q.pop();
        ans=vis[pos];
        for(int x:komsu[pos]){
            if(vis[x])continue;
            vis[x]=vis[pos]+1;
            q.push(x);
        }
    }
    cout<<ans;
}

int main(){
    ios_base::sync_with_stdio(false);cin.tie(NULL);
    bool usaco=0;if(usaco){freopen(".in","r",stdin);freopen(".out","w",stdout);}
    int t=1;
    if(!t)cin>>t;
    while(t--){code();cout<<endl;}
    return 0;
}

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

tracks.cpp: In function 'int main()':
tracks.cpp:83:35: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   83 |     bool usaco=0;if(usaco){freopen(".in","r",stdin);freopen(".out","w",stdout);}
      |                            ~~~~~~~^~~~~~~~~~~~~~~~~
tracks.cpp:83:60: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   83 |     bool usaco=0;if(usaco){freopen(".in","r",stdin);freopen(".out","w",stdout);}
      |                                                     ~~~~~~~^~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...