解题过程


开场发现J是水题,lfw写J过了,然后shl告诉lfwA题题意,lfw开始写A,中间又有人过了I,shl告诉lfw和byf  I题意,但是沟通出现了问题,lfw没有准确把握I题的题意,继续写A,shl和byf讨论I题,后来lfw又加入讨论,弄清楚了I题的题意,一起讨论出了I题怎么写,lfw让byf想I题的写法,然后继续写A题。A题WA了,lfw叫shl过来看代码,但是shl和lfw都没有发现问题,   byf开始写I,lfw和shl继续看题,讨论了一下很多人做的C题,还有看上去不太可做的D题,但是没有什么想法,byf A 掉 I 以后,lfw继续上机找A题的错误,此时byf发现了G题,大家一起讨论了一下,lfw提出高度只能是0和1,然后byf瞬间反应过来是平面图转对偶图,lfw不会,于是和shl开始讨论,shl上机写题,此时发现有人过E题,byf跟lfw开始讨论,但是lfw一开始又没有听懂byf表述的题意,花了好长时间弄清楚题意后,想出了分组背包,此时shl还在写G,中间发现memset不能设置为inf,shl不了解memset参数的意思,lfw和byf让shl直接用for循环,lfw继续看题,发现很多人过了H,而H题似乎可以扫描线做。shl交G题以后WA了,开始和byf一起查错,查错再交未果,lfw开始上机写E,E题写了一半lfw开始想不清楚dp数组定义的状态,于是下机给shl和byf继续修改G题的代码,然后lfw想清楚后,上机写E并ac了,最后byf和shl再次修改G的代码继续提交,坐在前面的出题人回头跟我们说你们的做法是对的,肯定是小细节出错了,但是还是WA。最后lfw上机找A题的错误,虽然中间有几次开始聊天划水不想找错误了,不过还是觉得不能放弃继续找错,于是在最后7,8分钟的时候发现A题循环时的漏洞,和对于不能逃出的人输出-1,而不是有人不能逃出就直接输出-1的低级输出错误

赛后发现是纸质题面的输入写错了,所以G WA了,如果G没有查错那么久,甚至还可以再做出H题。运气不好。

 


 

题解


 

 A、Escape LouvreⅠ

https://blog.csdn.net/liufengwei1/article/details/90053775

  1 #include<bits/stdc++.h>
  2 #define maxl 1010
  3 using namespace std;
  4 
  5 int n,m,p;
  6 int tx[5]={0,1,0,-1,0};
  7 int ty[5]={0,0,1,0,-1};
  8 int ans[maxl*maxl];
  9 int dis[maxl][maxl];
 10 struct peo
 11 {
 12     int x,y,w;    
 13 }a[maxl*maxl];
 14 struct que
 15 {
 16     int id,tm;
 17 };
 18 vector <que> ext[maxl][maxl];
 19 struct pr
 20 {
 21     int x,y;
 22     bool operator < (const pr &b)const
 23     {
 24         if(x==b.x)
 25             return y<b.y;
 26         return x<b.x;
 27     } 
 28 }outto[maxl][maxl];
 29 char ch[maxl][maxl];
 30 queue <pr> q;
 31 priority_queue <pr> priq;
 32 
 33 inline void prework()
 34 {
 35     for(int i=1;i<=n;i++)
 36         scanf("%s",ch[i]+1);
 37     for(int i=1;i<=p;i++)
 38     {
 39         scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].w);
 40         ans[i]=-1;
 41     }
 42     for(int i=1;i<=n;i++)
 43         for(int j=1;j<=m;j++)
 44             ext[i][j].clear();
 45 }
 46 
 47 inline bool cmp(const que &x,const que &y)
 48 {
 49     if(x.tm==y.tm)
 50     {
 51         return a[x.id].w>a[y.id].w;
 52     }
 53     return x.tm<y.tm;
 54 }
 55 
 56 inline void mainwork()
 57 {
 58     while(!q.empty()) q.pop();
 59     memset(dis,0x3f,sizeof(dis));
 60     for(int i=1;i<=n;i++)
 61         for(int j=1;j<=m;j++)
 62         if(ch[i][j]=='2')
 63         {
 64             q.push(pr{i,j});
 65             outto[i][j]=pr{i,j};
 66             dis[i][j]=0;
 67         }
 68     pr u;int xx,yy;
 69     while(!q.empty())
 70     {
 71         u=q.front();q.pop();
 72         for(int i=1;i<=4;i++)
 73         {
 74             xx=u.x+tx[i];yy=u.y+ty[i];
 75             if(xx>=1 && xx<=n && yy>=1 && yy<=m && ch[xx][yy]!='1')
 76             {
 77                 if(dis[xx][yy]>dis[u.x][u.y]+1)
 78                 {
 79                     dis[xx][yy]=dis[u.x][u.y]+1;
 80                     outto[xx][yy]=outto[u.x][u.y];
 81                     q.push(pr{xx,yy});
 82                 }
 83             }
 84         }
 85     }
 86     int tm;
 87     for(int i=1;i<=p;i++)
 88     if(dis[a[i].x][a[i].y]<dis[0][0])
 89     {
 90         u=outto[a[i].x][a[i].y];
 91         tm=dis[a[i].x][a[i].y];
 92         ext[u.x][u.y].push_back(que{i,tm});
 93     }
 94     int l,k;
 95     for(int i=1;i<=n;i++)
 96         for(int j=1;j<=m;j++)
 97         {
 98             l=ext[i][j].size();
 99             if(l==0) continue;
100             sort(ext[i][j].begin(),ext[i][j].end(),cmp);    
101             k=0;
102             tm=0;
103             while(!priq.empty()) priq.pop();
104             do
105             {
106                 if(k<l && ext[i][j][k].tm>tm && priq.empty())
107                     tm=ext[i][j][k].tm;
108                 while(k<l && ext[i][j][k].tm==tm)
109                 {    
110                     priq.push(pr{a[ext[i][j][k].id].w,ext[i][j][k].id});
111                     k++;
112                 }
113                 u=priq.top();priq.pop();
114                 ans[u.y]=tm;
115                 tm++;
116             }while(k<l || !priq.empty());
117         }
118 }
119 
120 inline void print()
121 {
122     for(int i=1;i<=p;i++)
123         printf("%d%c",ans[i],(i==p)?'\n':' ');
124 }
125 
126 int main()
127 {
128     while(~scanf("%d%d%d",&n,&m,&p))
129     {
130         prework();
131         mainwork();
132         print();
133     }
134     return 0;
135 }
View Code

相关文章: