QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#259057 | #6723. Grid with Arrows | AH20 | RE | 0ms | 17572kb | C++14 | 2.9kb | 2023-11-20 16:08:33 | 2023-11-20 16:08:33 |
Judging History
answer
#include<bits/stdc++.h>
using namespace std;
const int maxm = 2e5+7;
int n,m;
vector<vector<char>>dir;
vector<vector<int>>step;
vector<int>edge[maxm],ne[maxm];
int dfn[maxm],low[maxm],instk[maxm],stk[maxm],col[maxm];
int tot = 0,tp = 0,tc = 0;
int inv[maxm],vis[maxm];
int N;
void init(){
dir.resize(n,vector<char>(m));
step.resize(n,vector<int>(m,0));
//重置几个关键的数组
for(int i=0;i<=n*m;i++){
edge[i].clear();
ne[i].clear();
//清空邻接表的边
inv[i] = vis[i] = 0;
instk[i] = 0;col[i] = 0;
dfn[i] = 0;low[i] = 0;
stk[i] = 0;
}
tot = tp = tc = 0;
N = n*m;
}
void tarjan(int now){
dfn[now] = low[now] = ++tot;
stk[++tp] = now;
instk[now] = 1;
for(auto u:edge[now]){
if(dfn[u]==0){
tarjan(u);
low[now] = min(low[now],low[u]);
}
else{
if(instk[u]){
low[now] = min(low[now],low[u]);
}
}
}
if(low[now] == dfn[now]){
//说明该节点是强连通分量的起始点
++tc;
while(stk[tp] != now){
instk[stk[tp]] = 0;
col[stk[tp]] = tc;
--tp;
}
col[now] = tc;
instk[now] = 0;
--tp;
}
}
void work(){
//构造出新的图
for(int i=1;i<=N;i++){
for(auto u:edge[i]){
if(col[i] == col[u]) continue;
ne[col[i]].push_back(col[u]);
inv[col[u]]++;
}
}
}
int id(int x,int y){
return x*m + y+1;
}
void solve(){
cin>>n>>m;
init();
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
cin>>dir[i][j];
}
}
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
cin>>step[i][j];
}
}
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
int ni = i,nj = j;
switch (dir[i][j]){
case 'u':
ni = i - step[i][j];
break;
case 'd':
ni = i + step[i][j];
break;
case 'l':
nj = j - step[i][j];
break;
case 'r':
nj = j + step[i][j];
}
if(ni>=0 and ni<n and nj>=0 and nj<m){
edge[id(i,j)].push_back(id(ni,nj));
}
}
}
//完成建图,下面开始跑tarjan
for(int i=1;i<=N;i++){
if(dfn[i] == 0){
tarjan(i);
}
}
work();
int sum = 0;
for(int i=1;i<=tc;i++){
if(inv[i] == 0){ ++sum;}
}
if(sum > 1){
cout<<"No\n";
}
else{
cout<<"Yes\n";
}
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
int T;cin>>T;
while(T--) solve();
return 0;
}
详细
Test #1:
score: 100
Accepted
time: 0ms
memory: 17572kb
input:
2 2 3 rdd url 2 1 1 1 1 2 2 2 rr rr 1 1 1 1
output:
Yes No
result:
ok 2 token(s): yes count is 1, no count is 1
Test #2:
score: -100
Runtime Error
input:
1109 5 8 rddddldl drruludl rrldrurd urrrlluu uurrulrl 4 4 1 2 4 3 1 6 1 3 5 1 1 1 3 6 2 4 1 1 2 1 1 1 2 3 4 2 4 3 3 3 4 1 1 2 2 5 1 5 7 9 rdrddrdll urrdruldl ruullrulu drrlrlddl rrrdddlll ruulururl ruurrlluu 7 1 1 1 2 1 2 3 6 1 7 3 1 3 1 2 1 8 2 2 1 2 4 3 1 2 2 2 2 4 1 1 5 3 3 1 3 4 6 1 2 1 2 7 7 6 ...