2021 ICPC網路賽1 H Mesh Analysis
阿新 • • 發佈:2021-09-27
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; }