码迷,mamicode.com
首页 > 其他好文 > 详细

[2016-04-15][codeforces][660][D][Number of Parallelograms]

时间:2016-04-15 19:50:19      阅读:239      评论:0      收藏:0      [点我收藏+]

标签:

  • 时间:2016-04-15 18:40:17 星期五

  • 题目编号:[2016-04-15][codeforces][660][D][Number of Parallelograms]

  • 题目大意:给定n个点的坐标,问这些点能组成多少个平行四边形

  • 分析:

    • 每个平行四边形对角线互相平分,所以只要两条边的交点一样,那么这两条边(斜边)所对应的四边形就一定是平行四边形
    • 所以,枚举所有交点,计算相同交点的个数 Cnti,那么ans=Cnti×(Cnti?1)2
  • 遇到的问题:

    • 为了方便,计算交点的时候,没有除以2,但是在把点转换成一个数字来存的时候,x坐标乘了 1E9 ,应该乘2×1E9才对
    • 第一次计数用了map来计算,但是时间花了2000+ms,
    • 然后发现有100+ms,就是不用map存,直接把所有交点加入数组中,然后排序,计算相同点的个数
  1. //234ms
  2. #include<cstring>
  3. #include<cstdio>
  4. #include<algorithm>
  5. #include<map>
  6. using namespace std;
  7. const int maxn = 2000 + 10;
  8. struct Point{
  9. int x,y;
  10. }p[maxn];
  11. long long q[maxn*maxn];
  12. int main(){
  13. int n;
  14. scanf("%d",&n);
  15. for(int i = 0 ; i < n ; ++i){
  16. scanf("%d%d",&p[i].x,&p[i].y);
  17. }
  18. int cnt = 0;
  19. memset(q,-1,sizeof(q));
  20. for(int i = 0 ; i < n ; ++i){
  21. for(int j = i + 1 ; j < n ; ++j){
  22. long long k =((long long) p[i].x + p[j].x)*1E9*2 + (p[i].y) + p[j].y;
  23. q[cnt++] = k;
  24. }
  25. }
  26. sort(q , q + cnt);
  27. int k,ans = 0;
  28. for(int i = 0 ; i < cnt - 1 ;++i){
  29. k = 1;
  30. while(i < cnt && q[i] == q[i + 1]){
  31. ++i;++k;
  32. }
  33. ans += k * (k - 1) / 2;
  34. }
  35. printf("%d\n",ans);
  36. return 0;
  37. }
  1. //2214ms
  2. #include<cstdio>
  3. #include<map>
  4. using namespace std;
  5. struct Point{
  6. int x,y;
  7. Point(int a = 0,int b = 0):x(a),y(b){}
  8. }p[2000 + 10];
  9. map<long long,int > m;
  10. int main(){
  11. int n;
  12. scanf("%d",&n);
  13. for(int i = 0 ; i < n ; ++i){
  14. scanf("%d%d",&p[i].x,&p[i].y);
  15. }
  16. for(int i = 0 ; i < n ; ++i){
  17. for(int j = i + 1 ; j < n ; ++j){
  18. long long k =((long long) p[i].x + p[j].x)*1E9*2 + (p[i].y) + p[j].y;
  19. if(m.find(k) == m.end() ){
  20. m[k] = 1;
  21. }else ++m[k];
  22. }
  23. }
  24. map<long long,int>::iterator itm;
  25. int ans = 0;
  26. for(itm = m.begin(); itm != m.end();++itm){
  27. int n = itm -> second;
  28. ans += n * (n - 1) / 2;
  29. }
  30. printf("%d\n",ans);
  31. return 0;
  32. }




[2016-04-15][codeforces][660][D][Number of Parallelograms]

标签:

原文地址:http://www.cnblogs.com/qhy285571052/p/7c0e4bdf3744c4bab7f02dc1547fc831.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!