记录编号 559555 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 [NOIP 2016PJ]魔法阵 最终得分 100
用户昵称 Gravatar锝镆氪锂铽 是否通过 通过
代码语言 C++ 运行时间 0.073 s
提交时间 2021-03-17 18:59:28 内存使用 0.58 MiB
显示代码纯文本
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
using namespace std;
const int maxN = 2e4 + 10; 

int n, m, dis, y;
int a[maxN], b[maxN], c[maxN], d[maxN];//a,b,c,d分别表示每件物品四个位置的个数
int h[maxN << 1], w[maxN << 1];//h表示物品的魔法值,w表示每个魔法值出现的次数
int main(void){
	freopen("magicb.in", "r", stdin);
	freopen("magicb.out", "w", stdout);
	scanf("%d%d",&n,&m);
	for (int i = 1; i <= m; i ++){
		scanf("%d", &h[i]);
		w[h[i]] ++;
	}
	for (int i = 1; i <= n / 9; i ++){
		dis = 8 * i + 1;
		y = 0;//dis表示A到C的最小距离,y表示A、B的个数
		for (int j = n - 9 * i - 1; j >= 1; j --){
			y += w[j + dis] * w[j + dis + i];//A、B的个数取决于C、D有多少对,所以用C、D个数来乘
			a[j] += y * w[j + i + i];
			b[j + i + i] += y * w[j];
		}
		dis = 9 * i + 1;
		y = 0;//dis表示D到A的最小距离,y表示C、D的个数
		for (int j = 9 * i + 2; j <= n; j ++){
			y += w[j - dis] * w[j - dis + i + i];//C、D的个数取决于A、B有多少对,所以用A、B个数来乘
			c[j - i] += y * w[j];
			d[j] += y * w[j - i];
		}
	}
	for(int i = 1; i <= m; i ++){
		printf("%d %d %d %d\n",a[h[i]],b[h[i]],c[h[i]],d[h[i]]);
	}
}