题解
这道题真是感人啊,废了蒟蒻一天的时间
关键
1.
a[ k ][ ] 数组记录第k层有楼梯房间的编号
a[ k ][ 0 ] 第k层有几个有楼梯的房间
a[ k ][ i ] 第k层第 i 个有楼梯的房间
每层记录每一个房间的下一个有楼梯的房间,在后面牵扯到 x 的运算时会用到
也就是
2.这里讲一下 x 的处理:
因为 x 可能会很大,所以要处理一下,防止没用的跑很多圈,
代码
#include<bits/stdc++.h> using namespace std; const int mod=20123; int n,m,start,ans,b,c; int a[10005][105]; struct node { bool flag; int num; int next; }room[10005][105]; int main() { memset(a,-1,sizeof(a)); scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) { a[i][0]=0; int ge=0; for(int j=0;j<m;j++) { scanf("%d%d",&b,&c ); room[i][j].flag=b; room[i][j].num=c; room[i][j].next =-1; if(b==1) { a[i][0]++; a[i][++ge]=j; } } } scanf("%d",&start); for(int i=1;i<=n;i++) { int ge=0; for(int j=0;j<m;j++) { if(room[i][j].flag ==0) { room[i][j].next =a[i][ge+1]; if(ge==a[i][0]){room[i][j].next =a[i][1];} } else { ge++; if(ge==a[i][0]){room[i][j].next =a[i][1];} else{room[i][j].next =a[i][ge+1];} } } } for(int k=1;k<=n;k++) { ans=(ans+room[k][start].num)%mod; int mf=(room[k][start].num-1)%a[k][0]+1; int tim=0; if(room[k][start].flag ) tim++; while(tim<mf) { int now=room[k][start].next ; start=now; tim++; } } printf("%d\n",ans); return 0; }
原文:https://www.cnblogs.com/xiaoyezi-wink/p/11032080.html