2021 ICPC网络赛1
H Mesh Analysis
【解题思路】
输入当中上面的坐标是没用的。
我们分别记录每个点的neighboring points,以及它属于哪些elements即可。注意去重和排序,这里使用了vector,使用set也可以。
注意,查询当中 q的范围是-109到109,即有可能不存在这个编号的点,输出的时候要特判一下,代码中给了注释,比赛的时候就是差这一点没有AC。
【AC代码】
#include <iostream>
#include <cstdio>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
vector<int> v1[21005],v2[21005];
int main()
{
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int m,n,l,k,id,x,y,z;
string s;
double a,b,c;
cin>>m>>n;
for(int i=1;i<=m;i++)
{
cin>>id>>a>>b>>c;
}
for(int i=1;i<=n;i++)
{
cin>>id>>s;
if(s=="203")
{
cin>>x>>y>>z;
v1[x].emplace_back(y);
v1[x].emplace_back(z);
v1[y].emplace_back(x);
v1[y].emplace_back(z);
v1[z].emplace_back(x);
v1[z].emplace_back(y);
v2[x].emplace_back(id);
v2[y].emplace_back(id);
v2[z].emplace_back(id);
}
if(s=="102")
{
cin>>x>>y;
v1[x].emplace_back(y);
v1[y].emplace_back(x);
v2[x].emplace_back(id);
v2[y].emplace_back(id);
}
}
for(int i=1;i<=m;i++)
{
sort(v1[i].begin(),v1[i].end());
sort(v2[i].begin(),v2[i].end());
}
cin>>l;
while(l--)
{
cin>>k;
if(k<0)//加上这句AC,保险起见加上k>=21000,防止溢出vector开的范围
{
cout<<k<<endl<<"[]"<<endl<<"[]"<<endl;
continue;
}
cout<<k<<endl;
int size=v1[k].size();
if(size==0)
cout<<"[]"<<endl;
else
{
int temp=v1[k][0];
cout<<"["<<temp;
for(int i=1;i<size;i++)
{
if(v1[k][i]!=temp)
{
temp=v1[k][i];
cout<<","<<temp;
}
else
continue;
}
cout<<"]"<<endl;
}
size=v2[k].size();
if(size==0)
cout<<"[]"<<endl;
else
{
int temp=v2[k][0];
cout<<"["<<temp;
for(int i=1;i<size;i++)
{
if(v2[k][i]!=temp)
{
temp=v2[k][i];
cout<<","<<temp;
}
else
continue;
}
cout<<"]"<<endl;
}
}
return 0;
}