- 问答
DALAO球条
- @ 2025-8-1 19:04:14
#include<bits/stdc++.h>
#define NOC ios::sync_with_stdio(0);cin.tie();cout.tie();
#define up(a,b) for(int i=a;i<=b;i++)
#define dn(a,b) for(int i=a;i>=b;i--)
using namespace std;
const int maxn=1e5+2;
struct node
{
int x;
int y;
bool operator<(const node& other) const
{
if (x == other.x) return y > other.y;
return x > other.x;
}
};
struct tree
{
int num,str,fa=-1;
vector<node>son;
}lst[maxn];
bool cmp(node a,node b)
{
return a.y>b.y;
}
int main(){
NOC;
int n,q;
cin>>n>>q;
lst[1].fa=-114514;
for(int i=1;i<=n;i++)
{
lst[i].num=i;
int x;
cin>>x;
lst[i].str=x;
lst[i].son.push_back({i,x});
}
for(int i=1;i<=n;i++)
{
int u,v;
cin>>u>>v;
if(lst[u].fa==-114514)
{
lst[v].fa=u;
lst[u].son.push_back({v,lst[v].str});
continue;
}
if (lst[u].fa==-1)
{
lst[u].fa=v;
lst[v].son.push_back({u,lst[u].str});
lst[1].son.push_back({u,lst[u].str});
}
else
{
lst[v].fa=u;
lst[u].son.push_back({v,lst[v].str});
lst[1].son.push_back({u,lst[u].str});
}
}
for(int i=1;i<=n;i++) for(auto j:lst[i].son) lst[1].son.push_back(j);
for(int i=1;i<=n;i++)
{
sort(lst[i].son.begin(),lst[i].son.end(),cmp);
set<node>aaaa(lst[i].son.begin(),lst[i].son.end());
lst[i].son.assign(aaaa.begin(),aaaa.end());
}
for(int i=1;i<=n;i++)
{
for(auto j:lst[i].son) cout<<j.x<<' '<<j.y<<"|";
cout<<endl;
}
int v,k;
while(q--)
{
v=k=0;
cin>>v>>k;
cout<<v<<' '<<k<<' '<<lst[v].son[k].y<<endl;
}
return 0;
}
这个代码为什么RE了 正常输出
5 5|4 4|3 3|2 2|1 1|
5 5|3 3|2 2|
3 3|
4 4|
5 5|
1 2 4
2 1 5
我的输出
5 5|4 4|3 3|2 2|1 1|
5 5|3 3|2 2|
3 3|
4 4|
5 5|
2 1 5
2 1 5
1 条评论
-
winterini LV 7 @ 2025-8-21 20:26:11读入错误
树有n个节点,因此只有n-1条边。您的代码中循环次数为n次,这会尝试读取第n条边,但输入只有n-1条边,导致读取失败(可能使u和v的值为0或其他无效值),进而引发未定义行为。
查询越界错误
在查询时,你直接使用k作为索引访问lst[v].son数组。但数组索引从0开始,而输入的k通常是从1开始计数的(即k=1表示第一个儿子)。因此,当k为0或大于son数组的大小时,会导致数组越界,从而引发RE。
另外我没看懂你的建树逻辑,太乱了(例如,将节点重复添加到节点1的son中),但根据输出示例,这部分似乎勉强工作。主要问题在于上述两点。
注:我大概能看出这是个树结构查询系统,但是没有具体题目,我只能按照模板看,有错有质疑可指出,我会详细说明/改错
- 1