- 分享
- @ 2026-08-08 15:42:50
我是ItzRealMe,我可以解决问题(2026 06 8级T1,T2已完成)
2 条评论
-
202607gj03盛辰 (shengchen) LV 8 @ 2026-09-02 22:42:30
2564如果会的话
-
@ 2026-09-02 13:45:07
你是谁
- 1
2564如果会的话
洛谷过了
#include <iostream>
#include <vector>
#include <cstring>
using namespace std;
const int MAXN = 305;
bool anc[MAXN][MAXN];
int fa[MAXN];
void get_ancestor(int x)
{
int cur = x;
while(true)
{
anc[x][cur] = true;
if(cur == 0) break;
cur = fa[cur];
}
}
int main()
{
int N;
cin >> N;
for(int i = 1; i <= N-1; ++i)
{
cin >> fa[i];
}
memset(anc, 0, sizeof(anc));
for(int i = 0; i < N; ++i)
{
get_ancestor(i);
}
int Q;
cin >> Q;
while(Q--)
{
int m;
cin >> m;
vector<int> pts(m);
for(int i = 0; i < m; ++i)
{
cin >> pts[i];
}
int ans = 0;
for(int cand = N-1; cand >=0; cand--)
{
bool ok = true;
for(int p : pts)
{
if(!anc[p][cand])
{
ok = false;
break;
}
}
if(ok)
{
ans = cand;
break;
}
}
cout << ans << endl;
}
return 0;
}
@ItzRealMe: 我原代码洛谷也过了,但是vijos过不了(60pts)
@202607gj03盛辰 (shengchen):
#include<bits/stdc++.h>
using namespace std;
const int N = 305;
int fa[N], dep[N];
bool vis[N];
vector<int> ch[N];
int getdep(int x) {
return x == 0 ? 0 : getdep(fa[x]) + 1;
}
void dfs(int x) {
vis[x] = 1;
for (int y : ch[x])
dfs(y);
}
bool check(int x, int n, const vector<int> &vec) {
for(int i = 0; i <= n; i ++)
vis[i] = 0;
dfs(x);
for (int y : vec)
if(! vis[y])
return 0;
return 1;
}
int main() {
int n;
scanf("%d", &n);
for(int i = 1; i < n; i ++) {
scanf("%d", &fa[i]);
ch[fa[i]].push_back(i);
}
for(int i = 1; i < n; i ++)
dep[i] = getdep(i);
int q;
scanf("%d", &q);
while(q --) {
int m, mnd = n + 1;
scanf("%d", &m);
vector<int> vec(m);
for(int i = 0; i < m; i ++) {
scanf("%d", &vec[i]);
mnd = min(mnd, dep[vec[i]]);
}
for (int i = n - 1; i >= 0; i --)
if (dep[i] <= mnd && check(i, n, vec)) {
printf("%d\n", i);
break ;
}
}
return 0;
}
这个代码洛谷也能过,但这个网站只能40pts
@ItzRealMe: 我不知道可能最近就是这样
@ItzRealMe: 这个鬼题目甚至是六级的壳,八级的题。