解题过程
开场发现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题。运气不好。
题解
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 }