題解:
– 簡單的模拟題, 因為每層樓都是一個環,是以可以把需要找到第幾個房間對整層樓的有樓梯的房間數取模,然後在輸入時把所有有樓梯的房間儲存下來,用
lower_bound
直接查找,時間複雜度:O(nlogn)
– 具體原理請自行舉個栗子,絕對沒有錯的。
代碼:
#include<iostream>
#include<cmath>
#include<cstring>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<vector>
#include<map>
using namespace std;
const int MAXN=;
int n,m,now;
struct hehe{
int shu[];
int sum;
int f[];
}Floor[MAXN];
long long ans;
int main(){
// freopen("treasure.in","r",stdin);
// freopen("treasure.out","w",stdout);
cin>>n>>m;
for(int i=;i<=n;i++)
for(int j=;j<m;j++){
int ti;
scanf("%d%d",&ti,&Floor[i].shu[j]);
if(ti){
Floor[i].f[Floor[i].sum]=j;
Floor[i].sum++;
}
}
cin>>now;
for(int i=;i<=n;i++){
int step=Floor[i].shu[now];
ans+=step;
ans%=;
step%=Floor[i].sum;
int j=lower_bound(Floor[i].f,Floor[i].f+Floor[i].sum,now)-Floor[i].f;
j+=step-;
if(j>=Floor[i].sum)
j-=Floor[i].sum;
if(j<)
j=Floor[i].sum-;
now=Floor[i].f[j];
}
cout<<ans;
return ;
}