这个题很有意思,明明可以用数组做,但是我就是想用set写
思路如下:
1匹配y值相同的情况下一条直线上的任意n个点(排序过的)第i 和第n-i个点的中点是否与其他配对的两个点的中点为同一个,如果是同一个,说明它们关于这个x轴(竖线)对称。然后判断所有的点,注意不要忽略某些点有可能在对称轴上的情况。
代码如下:
#include<iostream> #include<algorithm> #include<cstring> #include<string> #include<cmath> #include<queue> #include<cstdio> #include<map> #include<set> using namespace std; set<int>s[20005]; int main(){ int n; cin>>n; while(n--){ int x; cin>>x; while(x--){ int t1,t2; cin>>t1>>t2; t1+=10000;t2+=10000; s[t2].insert(t1); } int ans=0; bool flag=false; for(int i=0;i<=20000;i++){ set<int>::iterator itbegin=s[i].begin(); set<int>::iterator itend=s[i].end(); if(s[i].empty())continue; itend--; while(itbegin!=itend && *itbegin<=*itend){ // cout<<"*"<<*itbegin<<" "<<*itend<<endl; if(ans==0){ ans=*itend+*itbegin; ans/=2; } else{ int temp=*itend+*itbegin; temp/=2; if(temp!=ans){ flag=true; break; } } itbegin++; itend--; } if(itbegin==itend){//判断某条横线上最后一个点是否满足(当然,如果它的数量是2的倍数就没有最<span style="white-space:pre"> </span>//后一个点了) if(ans==0){ ans=*itend+*itbegin; ans/=2; } else{ int temp=*itend+*itbegin; temp/=2; if(temp!=ans){ flag=true; break; } } } if(flag)break; } if(flag)cout<<"NO"<<endl; else cout<<"YES"<<endl; for(int i=0;i<=20000;i++)s[i].clear(); } }