题意:

幽幽子正在练习符卡[反魂蝶八分咲]
冥界可以抽象成一个无限大的二维平面,其中白玉楼在 ( 0 , 0 ) (0,0) (0,0),冥界上存在着 n n n个幽灵,第 i i i个幽灵位于点 ( x i , y i ) (x_i,y_i) (xi​,yi​)。
一次符卡的释放可以看做一条直线,由于幽幽子身处白玉楼,所以这条直线经过原点。幽幽子想让自己的符卡看起来尽量优美,她定义一次符卡的释放是优美的,当且仅当所有的幽灵在这条直线上的投影是中心对称的。
现在幽幽子想要知道有多少种优美的释放符卡的方式,如果每一种方法都是优美的输出 − 1 -1 −1。

数据范围:

对于 30 30 30%的数据, n ≤ 10 n\leq10 n≤10
对于 60 60 60%的数据, n ≤ 200 n\leq200 n≤200
对于 100 100 100%的数据, n ≤ 1000 , ∣ x i ∣ , ∣ y i ∣ ≤ 1 0 6 , T ≤ 3 n\leq1000,|x_i|,|y_i|\leq10^6,T\leq3 n≤1000,∣xi​∣,∣yi​∣≤106,T≤3

Analysis:

大力猜结论,暴力出奇迹。
最后投影出来的中心对称点,一定是原点集的重心在这条直线上的对应点。
证明一下:
我们考虑把投影表示成向量的点积形式。若当前有一向量 ( x 0 , y 0 ) (x_0,y_0) (x0​,y0​)。
我们把原点集投影其上, ( x , y ) (x,y) (x,y)会变为 ( x ∗ x 0 , y ∗ y 0 ) (x*x_0,y*y_0) (x∗x0​,y∗y0​)。
那么在这条向量上的对称点为: ( ∑ x ∗ x 0 n , ∑ y ∗ y 0 n ) (\frac{\sum{x*x_0}}{n},\frac{\sum{y*y_0}}{n}) (n∑x∗x0​​,n∑y∗y0​​)。将 x 0 x_0 x0​提到求和之外。
而原点集重心为: ( ∑ x n , ∑ y n ) (\frac{\sum{x}}{n},\frac{\sum{y}}{n}) (n∑x​,n∑y​)。刚好是它投影出来的向量,证毕。
那我们考虑让每一对对称,我们枚举一对点,它们所连线段的中点与重心连线的法线,移到原点处,即为让他们对称的直线,这比较显然。
然后发现,一条直线合法,至少要出现 n 2 \frac{n}{2} 2n​次,那么这样的直线只有最多只有 n n n条。因为一条直线至少会有 n 2 \frac{n}{2} 2n​对对称点。
我们排序后暴力判断即可。复杂度 O ( n 2 log ⁡ ( n 2 ) ) O(n^2\log{(n^2)}) O(n2log(n2))。

Code:

# include<cstdio>
# include<cstring>
# include<algorithm>
# include<cmath>
using namespace std;
const int N = 1e3 + 5;
const int X = 1e6;
typedef double db;
const db eps = 1e-6;
const db inf = 1e7;
struct node
{db x,y;node operator + (node r) const{ return (node){x + r.x,y + r.y}; }node operator * (node r) const{ return (node){x * r.x,y * r.y}; }bool operator == (node r) const{ return fabs(x - r.x) <= eps && fabs(y - r.y) <= eps; }bool operator < (node r) const{ return fabs(x - r.x) <= eps ? y < r.y : x < r.x; }
}p[N],s[N],z,D;
struct data
{db k,b;bool operator == (data r) const{ return fabs(k - r.k) <= eps; }bool operator < (data r) const{ return k < r.k; }
}L[N * N];
int vis[N];
int n,T,h,tot,ans;
inline node calc(data x,data y)
{db X = y.b / (x.k - y.k),Y = X * x.k;return (node){X,Y};
}
inline void solve(int x)
{data P;if (fabs(L[x].k) > eps) P = (data){-1.0 / L[x].k,0};P.b = z.y - z.x * P.k; node mid;if (fabs(L[x].k) > eps && fabs(L[x].k - inf) > eps) mid = calc(L[x],P);else if (fabs(L[x].k) <= eps) mid = (node){z.x,0};else mid = (node){0,z.y};for (int i = 1 ; i <= h ; ++i){P.b = p[i].y - p[i].x * P.k;if (fabs(L[x].k) > eps && fabs(L[x].k - inf) > eps) s[i] = calc(L[x],P);else if (fabs(L[x].k) <= eps) s[i] = (node){p[i].x,0};else s[i] = (node){0,p[i].y};} sort(s + 1,s + h + 1);if ((h & 1) && !(s[h / 2 + 1] == mid)) return;for (int i = 1 ; i <= h / 2 ; ++i){node now = s[i] + s[h - i + 1];now.x /= 2.0,now.y /= 2.0;if (!(now == mid)) return;} ++ans;
}
int main()
{freopen("life.in","r",stdin);freopen("life.out","w",stdout);scanf("%d",&T);while (T--){scanf("%d",&n); z = (node){0,0},memset(vis,0,sizeof(vis)),ans = 0;for (int i = 1 ; i <= n ; ++i) scanf("%lf%lf",&p[i].x,&p[i].y),z = z + p[i];z.x /= (db)n,z.y /= (db)n,h = 0;z.x *= 2.0,z.y *= 2.0;for (int i = 1 ; i <= n ; ++i)for (int j = i + 1 ; j <= n ; ++j)if ((p[i] + p[j]) == z) vis[i] = vis[j] = 2;z.x /= 2.0,z.y /= 2.0,tot = 0;for (int i = 1 ; i <= n ; ++i) if (!vis[i]) p[++h] = p[i];if (h <= 1) { puts("-1"); continue; }for (int i = 1 ; i <= h ; ++i)for (int j = i + 1 ; j <= h ; ++j){node now = p[i] + p[j];now.x /= 2.0,now.y /= 2.0;if (fabs(now.x - z.x) <= eps) L[++tot] = (data){0,0};else if (fabs(now.y - z.y) <= eps) L[++tot] = (data){inf,0};else L[++tot] = (data){-1.0 / ((now.y - z.y) / (now.x - z.x)),0};}sort(L + 1,L + tot + 1); int las = 1;L[tot + 1] = (data){-inf,0};for (int i = 1 ; i <= tot ; ++i)if (!(L[i] == L[i + 1])){if (i - las + 1 >= h / 2) solve(i);las = i + 1;} printf("%d\n",ans);}return 0;
}

JZOJ5953. 【NOIP2018模拟11.5A组】生死之境相关推荐

  1. JZOJ-senior-5953. 【NOIP2018模拟11.5A组】生死之境

    Time Limits: 2000 ms Memory Limits: 524288 KB Detailed Limits Description 幽幽子正在练习符卡[反魂蝶八分咲] 冥界可以抽象成一 ...

  2. JZOJ 5952. 【NOIP2018模拟11.5A组】凯旋而归

    Description Input 第一行一个整数 n,表示数的个数. 第二行n个整数,第i个整数为ai . Output n行一个整数表示答案,第i行表示序列第i个前缀的帅气值. Sample In ...

  3. JZOJ5952. 【NOIP2018模拟11.5A组】凯旋而归

    题解 设sis_isi​表示前缀和, 那么答案就是 si+sis_i+s_isi​+si​ xor sjs_jsj​ i<j 显然当这一位是1的时候,无论i取什么,对答案是没有任何. 就考虑j是 ...

  4. JZOJ-senior-5952. 【NOIP2018模拟11.5A组】凯旋而归

    Time Limits: 1000 ms Memory Limits: 524288 KB Description Input 第一行一个整数 n,表示数的个数. 第二行n个整数,第i个整数为ai . ...

  5. JZOJ 5956. 【NOIP2018模拟11.7A组】easy LCA

    Description Input Output 输出一行一个整数,表示所求的所有连续子段的权值和. Sample Input 6 1 2 2 6 6 3 3 4 6 5 1 2 3 4 5 6 Sa ...

  6. jozj5945. 【NOIP2018模拟11.02】昆特牌

    5945. [NOIP2018模拟11.02]昆特牌 Description 作为一个资深OIer,你被邀请到位于波兰的CDPR总部参观.但没想到你刚一到就遇到了麻烦.昆特牌的数据库发生了故障.原本昆 ...

  7. JZOJ 3518. 【NOIP2013模拟11.6A组】进化序列(evolve)

    3518. [NOIP2013模拟11.6A组]进化序列(evolve) (File IO): input:evolve.in output:evolve.out Time Limits: 1000 ...

  8. jzoj2702. 探险jzoj3917. 【NOIP2014模拟11.2A组】福慧双修

    Description 探险家小T好高兴!X国要举办一次溶洞探险比赛,获奖者将得到丰厚奖品哦!小T虽然对奖品不感兴趣,但是这个大振名声的机会当然不能错过! 比赛即将开始,工作人员说明了这次比赛的规则: ...

  9. [jzoj NOIP2018模拟 11.01]

    很庆幸打了这场模拟赛,因为这一场爆零 好像上次纪中的某场比赛我也出现了同样的问题,光是计算时间复杂度而忘记了空间的限制.想必是比上次惨的,考场上就写了两题而这两题都因为MLE爆零了.而且我T2还码了7 ...

最新文章

  1. 史上最全的数据库面试题,不看后悔篇!
  2. OpenCvSharp 形态学操作(膨胀、腐蚀)
  3. linux 查看java进程_Linux进程查看及管理工具(ps, vmstat, dstat, glances等)
  4. CynosDB技术详解——存储集群管理【文末有福利】
  5. echart地图配置
  6. 常见 Serverless 架构模式
  7. cytoscape要求的JAVA版本_微生物研究必备:Cytoscape绘制网络图(一)
  8. 【Python基础】Python中必须知道的5对魔术方法
  9. SSIM(structural similarity index),结构相似性
  10. vsftpd安装问题汇总(持续更新。。)
  11. mysql报tns无监听_oracle提示TNS:无监听程序的解决办法
  12. python 实现SOM: 函数更新
  13. Fuchsia中GN与Ninja构建demo
  14. Unity LitJson的教程
  15. MapGuide/AIMS在台湾?
  16. 【转载】Attention Mechanism in Deep Learning
  17. A Magic Lamp
  18. 马帅:我的同事王开源-真正开源斗士
  19. 用python对excel进行行列操作
  20. Ceph mimic

热门文章

  1. 完全免费,界面友好的文件批量更名工具Bulk Rename Utility
  2. 字节跳动面试题.个人玩抛硬币的游戏,谁先抛到正面就获胜。那么先抛的人获胜概率为?
  3. JAVA快递单号查询接口对接第三方快递鸟api接口教程
  4. RFID技术在固定资产管理中的作用
  5. MySql数据库三种关系详解
  6. MacOS 中解压缩(unzip)出现 illegal byte sequence 的解决方案
  7. PHP代码审计DVWA[JavaScript]
  8. C++ Primer(第四版)答案之第八章
  9. 【龟兔赛跑: 1、总里程100米 2、兔子每秒跑5米,每20米要休息2秒 3、乌龟每秒钟4米,不休息 4、谁先到达终点,比赛结束】
  10. 茗创:功能磁共振数据处理业务