2021 ICPC网络赛1 H Mesh Analysis
2021 ICPC网络赛1 H Mesh Analysis
当时觉得没这么简单,就往复杂了想。。。。
题意:
给定n个点的编号和坐标,然后给定了m个图形,如果是203是个三角形就有三个点,如果是102就是条线段就两个点;接下来q个查询,每个查询一个点,输出和这个点在一个平面上的点,和这个点在哪几个图形中
思路:
输入当中上面的坐标是没用的。
我们分别记录每个点的neighboring points,以及它属于哪些elements即可。注意去重和排序,这里使用set就可以,并且set自动升序排序并且去重。
注意,查询当中 q的范围是-109到109,即有可能不存在这个编号的点,输出的时候要特判一下,用map来离散化一下就可以
代码:
#include <bits/stdc++.h>
using namespace std;
#define int long long
int n,m;
const int N=1e5+10;
set<int>st1[N],st2[N];//st1存储相邻的点,st2存储在哪些图形上
unordered_map<int,int>mp;//mp来离散化
int cnt=0;
signed main() {
ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
cin>>n>>m;
for(int i=1;i<=n;i++){
double u,v,x;
int idx;
cin>>idx>>u>>v>>x;
}
for(int i=1;i<=m;i++){
int idx,u,v,w,opt;
cin>>idx>>opt;
if(opt==203){
cin>>u>>v>>w;
if(!mp[u]) mp[u]=++cnt;
if(!mp[v]) mp[v]=++cnt;
if(!mp[w]) mp[w]=++cnt;
int uu,vv,ww;
uu=mp[u],vv=mp[v],ww=mp[w];
st1[uu].insert(v);st1[uu].insert(w);
st1[vv].insert(u);st1[uu].insert(w);
st1[ww].insert(v);st1[ww].insert(u);
st2[uu].insert(idx);
st2[vv].insert(idx);
st2[ww].insert(idx);
}
else{
cin>>u>>v;
if(!mp[u]) mp[u]=++cnt;
if(!mp[v]) mp[v]=++cnt;
int uu,vv,ww;
uu=mp[u],vv=mp[v];
st1[uu].insert(v);;
st1[vv].insert(u);;
st2[uu].insert(idx);
st2[vv].insert(idx);
}
}
int qq;
cin>>qq;
for(int x=1;x<=qq;x++){
int idx;
cin>>idx;
cout<<idx<<"\n";
if(!mp[idx]){
cout<<"[]\n[]";
}
else{
cout<<"[";
int cntt=0;
for(auto kk:st1[mp[idx]]){
++cntt;
if(cntt==st1[mp[idx]].size()){
cout<<kk<<"]\n";
}
else cout<<kk<<",";
}
cout<<"[";
cntt=0;
for(auto kk:st2[mp[idx]]){
++cntt;
if(cntt==st2[mp[idx]].size()){
cout<<kk<<"]";
}
else cout<<kk<<",";
}
}if(x!=qq) cout<<"\n";
}
return 0;
}

浙公网安备 33010602011771号