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;
}
posted @ 2021-09-27 19:15  Curry_BP  阅读(160)  评论(0)    收藏  举报