1. 程式人生 > 其它 >2021 ICPC網路賽1 H Mesh Analysis

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;
}