# 題目
APCS 模擬團隊 OJ apcs0103 樹裡資優班 (Tree Gifted Class)
# 解題思路
目前沒東西...
# 程式碼
#include<bits/stdc++.h> | |
using namespace std; | |
#define Rabbir_Reaper ios_base::sync_with_stdio(0); cin.tie(0); | |
const int N = 1e5+5; | |
vector<int> adj[N]; | |
string s; | |
int parent[N],now; | |
int main(){ | |
Rabbir_Reaper | |
int n; | |
cin>>n; | |
for(int i=1,t;i<=n;i++){ | |
cin>>t; | |
for(int j=0,temp;j<t;j++){ | |
cin>>temp; | |
adj[i].push_back(temp); | |
parent[temp] = i; | |
} | |
sort(adj[i].begin(),adj[i].end()); | |
} | |
for(int i=1;i<=n;i++){ | |
if(parent[i] == 0) now = i; | |
} | |
cin>>s; | |
for(int i=0;i<s.size();i++){ | |
if(s[i] == 'P'){ | |
if(parent[now] == 0) break; | |
else now = parent[now]; | |
}else if(s[i] == 'C'){ | |
int temp = 0; | |
i++; | |
while(s[i]>='0' && s[i]<='9'){//* | |
temp*=10; | |
temp+=s[i++]-'0'; | |
} | |
i--; | |
if(temp > adj[now].size()) break; | |
now = adj[now][temp-1]; | |
}else if(s[i] == 'R'){ | |
if(parent[now] == 0) break; | |
int j=0; | |
while(adj[parent[now]][j] != now) j++; | |
if(j+1 < adj[parent[now]].size()) now = adj[parent[now]][j+1]; | |
else break; | |
}else if(s[i] == 'L'){ | |
if(parent[now] == 0) break; | |
int j=0; | |
while(adj[parent[now]][j] != now) j++; | |
if(j-1 >=0) now = adj[parent[now]][j-1]; | |
else break; | |
} | |
// cout<<now<<" "; | |
} | |
cout<<now; | |
} |
# 測資加強版
#include<bits/stdc++.h> | |
using namespace std; | |
#define Rabbir_Reaper ios_base::sync_with_stdio(0); cin.tie(0); | |
const int N = 1e6+5; | |
vector<int> adj[N]; | |
string s; | |
int parent[N],now; | |
int main(){ | |
Rabbir_Reaper | |
int n; | |
cin>>n; | |
for(int i=1,t;i<=n;i++){ | |
cin>>t; | |
for(int j=0,temp;j<t;j++){ | |
cin>>temp; | |
adj[i].push_back(temp); | |
parent[temp] = i; | |
} | |
sort(adj[i].begin(),adj[i].end()); | |
} | |
for(int i=1;i<=n;i++){ | |
if(parent[i] == 0){ | |
now = i; | |
break; | |
} | |
} | |
cin>>s; | |
for(int i=0;i<s.size();i++){ | |
if(s[i] == 'P'){ | |
if(parent[now] == 0) break; | |
else now = parent[now]; | |
}else if(s[i] == 'C'){ | |
int temp = 0; | |
i++; | |
while(s[i]>='0' && s[i]<='9'){ | |
temp*=10; | |
temp+=s[i++]-'0'; | |
} | |
i--; | |
if(temp > adj[now].size()) break; | |
now = adj[now][temp-1]; | |
}else if(s[i] == 'R'){ | |
if(parent[now] == 0) break; | |
auto it = upper_bound(adj[parent[now]].begin(),adj[parent[now]].end(), now); | |
if(it == adj[parent[now]].end()){ | |
break; | |
} | |
now = *it ; | |
}else if(s[i] == 'L'){ | |
if(parent[now] == 0) break; | |
auto it = lower_bound(adj[parent[now]].begin(),adj[parent[now]].end(), now); | |
if(it == adj[parent[now]].begin()){ | |
break; | |
} | |
now = *(--it) ; | |
} | |
// cout<<now<<" "; | |
} | |
cout<<now; | |
} |