记录编号 559555 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 [NOIP 2016PJ]魔法阵 最终得分 100
用户昵称 Gravatar锝镆氪锂铽 是否通过 通过
代码语言 C++ 运行时间 0.073 s
提交时间 2021-03-17 18:59:28 内存使用 0.58 MiB
显示代码纯文本
  1. #include <algorithm>
  2. #include <iostream>
  3. #include <cstring>
  4. #include <cstdio>
  5. #include <cmath>
  6. using namespace std;
  7. const int maxN = 2e4 + 10;
  8.  
  9. int n, m, dis, y;
  10. int a[maxN], b[maxN], c[maxN], d[maxN];//a,b,c,d分别表示每件物品四个位置的个数
  11. int h[maxN << 1], w[maxN << 1];//h表示物品的魔法值,w表示每个魔法值出现的次数
  12. int main(void){
  13. freopen("magicb.in", "r", stdin);
  14. freopen("magicb.out", "w", stdout);
  15. scanf("%d%d",&n,&m);
  16. for (int i = 1; i <= m; i ++){
  17. scanf("%d", &h[i]);
  18. w[h[i]] ++;
  19. }
  20. for (int i = 1; i <= n / 9; i ++){
  21. dis = 8 * i + 1;
  22. y = 0;//dis表示A到C的最小距离,y表示A、B的个数
  23. for (int j = n - 9 * i - 1; j >= 1; j --){
  24. y += w[j + dis] * w[j + dis + i];//A、B的个数取决于C、D有多少对,所以用C、D个数来乘
  25. a[j] += y * w[j + i + i];
  26. b[j + i + i] += y * w[j];
  27. }
  28. dis = 9 * i + 1;
  29. y = 0;//dis表示D到A的最小距离,y表示C、D的个数
  30. for (int j = 9 * i + 2; j <= n; j ++){
  31. y += w[j - dis] * w[j - dis + i + i];//C、D的个数取决于A、B有多少对,所以用A、B个数来乘
  32. c[j - i] += y * w[j];
  33. d[j] += y * w[j - i];
  34. }
  35. }
  36. for(int i = 1; i <= m; i ++){
  37. printf("%d %d %d %d\n",a[h[i]],b[h[i]],c[h[i]],d[h[i]]);
  38. }
  39. }