警示后人:如果你 WA 5 9 12 14

P2895 [USACO08FEB] Meteor Shower S

IYSY2009I @ 2023-08-04 21:53:44

  1. 所有格子的流星降落时间设为无穷大,意为该格子安全。
  2. 同一个格子可能被流星砸多次,需要对时间取 \min(这就是为什么要注意第一条),而且上下左右四个格子都需要取 \min

下面给出我的代码,带注释的行就是上面提到的需要注意的点,把所有注释取消掉交上就能满分。

#include<iostream>
#include<cstdio>
#include<queue>
using namespace std;
int mp[305][305];
bool vis[305][305];
int cnt;
int x[400005];
int y[400005];
int t[400005];
queue<pair<int,int> > q;
int main(){
    int m;
    scanf("%d",&m);
//  t[0]=1e9;
    x[0]=304,y[0]=304;
//  for(int i=1;i<=4*m;i++)
//      t[i]=1e9;
    for(int i=1;i<=m;i++){
        cnt++;
        scanf("%d%d%d",&x[cnt],&y[cnt],&t[cnt]);
//      if(t[mp[x[cnt]][y[cnt]]]>t[cnt]) mp[x[cnt]][y[cnt]]=cnt;
        int id=cnt;
        if(x[cnt]>0){
            cnt++;
            x[cnt]=x[id]-1;
            y[cnt]=y[id];
            t[cnt]=t[id];
//          if(t[mp[x[cnt]][y[cnt]]]>t[cnt]) mp[x[cnt]][y[cnt]]=cnt;
        }
        if(y[cnt]>0){
            cnt++;
            x[cnt]=x[id];
            y[cnt]=y[id]-1;
            t[cnt]=t[id];
//          if(t[mp[x[cnt]][y[cnt]]]>t[cnt]) mp[x[cnt]][y[cnt]]=cnt;
        }
        cnt++;
        x[cnt]=x[id]+1;
        y[cnt]=y[id];
        t[cnt]=t[id];
//      if(t[mp[x[cnt]][y[cnt]]]>t[cnt]) mp[x[cnt]][y[cnt]]=cnt;
        cnt++;
        x[cnt]=x[id];
        y[cnt]=y[id]+1;
        t[cnt]=t[id];
//      if(t[mp[x[cnt]][y[cnt]]]>t[cnt]) mp[x[cnt]][y[cnt]]=cnt;
    }
    if(!mp[0][0]){
        printf("0");
        return 0;
    }
    if(!t[mp[0][0]]||!t[mp[0][1]]||!t[mp[1][0]]){
        printf("-1");
        return 0;
    }
    q.push(make_pair(mp[0][0],0));
    while(!q.empty()){
        pair<int,int> p=q.front();
        q.pop();
        if(vis[x[p.first]][y[p.first]]) continue;
        vis[x[p.first]][y[p.first]]=1;
        if(!mp[x[p.first]][y[p.first]]){
            printf("%d",p.second);
            return 0;
        }
        if(x[p.first]>0&&t[mp[x[p.first]-1][y[p.first]]]>p.second+1) q.push(make_pair(mp[x[p.first]-1][y[p.first]],p.second+1));
        if(t[mp[x[p.first]+1][y[p.first]]]>p.second+1) q.push(make_pair(mp[x[p.first]+1][y[p.first]],p.second+1));
        if(y[p.first]>0&&t[mp[x[p.first]][y[p.first]-1]]>p.second+1) q.push(make_pair(mp[x[p.first]][y[p.first]-1],p.second+1));
        if(t[mp[x[p.first]][y[p.first]+1]]>p.second+1) q.push(make_pair(mp[x[p.first]][y[p.first]+1],p.second+1));
    }
    printf("-1");
    return 0;
} 

by syk123 @ 2023-10-02 11:31:11

谢谢兄弟了


|