哈喽各位观众朋友们,小酱和大家又见面啦…
上期有同学在后台给我留言说:…
我懵了,我打成第四题啦??
好像还真是…
不好意思,我真打错了!
诚挚地向这位@weixin_46105182同学表示由衷的感谢!不过今天是真正的第四题啦~
题目描述
(本题目为2016NOIP普及组T4)
六十年一次的魔法战争就要开始了,大魔法师准备从附近的魔法场中汲取魔法能量。
大魔法师有 m 个魔法物品,编号分别为 1,2,…,m。每个物品具有一个魔法值,我们用 Xi 表示编号为 i 的物品的魔法值。每个魔法值 Xi 是不超过 n 的正整数,可能有多个物品的魔法值相同。
大魔法师认为,当且仅当四个编号为 a,b,c,d 的魔法物品满足 Xa< Xb< Xc< Xd,Xb-Xa=2(Xd-Xc),并且 Xb-Xa<(Xc-Xb)/3 时,这四个魔法物品形成了一个魔法阵,他称这四个魔法物品分别为这个魔法阵的 A 物品,B 物品,C 物品,D 物品。
现在,大魔法师想要知道,对于每个魔法物品,作为某个魔法阵的 A 物品出现的次数,作为 B 物品的次数,作为 C 物品的次数,和作为 D 物品的次数。
输入
第一行包含两个空格隔开的正整数 n 和 m。
接下来 m 行,每行一个正整数,第 i+1 行的正整数表示 Xi,即编号为 i 的物品的魔法值。
输出
共输出 m 行,每行四个整数。
第 i 行的四个整数依次表示编号为 i 的物品作为A,B,C,D 物品分别出现的次数。
样例输入
30 8
1
24
7
28
5
29
26
24
样例输出
4 0 0 0
0 0 1 0
0 2 0 0
0 0 1 1
1 3 0 0
0 0 0 2
0 0 2 2
0 0 1 0
提示
【数据范围】
1<=n<=15000,1<=m<=40000
枚举上场!
#include
#include
#define MAXN 50010
using namespace std;
int n,m;
int a[MAXN],b[MAXN],c[MAXN],d[MAXN];
int x[MAXN],tt[MAXN];
int main()
{
//freopen("magic.in","r",stdin);
//freopen("magic.out","w",stdout);
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
{
scanf("%d",&x[i]);
tt[x[i]]++;
}
for(int t=1;t*9<n;t++)
{
int sum=0;
for(int dx=9*t+2;dx<=n;dx++)
{
int ax=dx-9*t-1;
int bx=ax+2*t;
int cx=dx-t;
sum=sum+tt[ax]*tt[bx];
c[cx]=c[cx]+tt[dx]*sum;
d[dx]=d[dx]+tt[cx]*sum;
}
sum=0;
for(int ax=n-9*t-1;ax;ax--)
{
int bx=ax+2*t;
int cx=bx+6*t+1;
int dx=ax+9*t+1;
sum=sum+tt[cx]*tt[dx];
a[ax]=a[ax]+tt[bx]*sum;
b[bx]=b[bx]+tt[ax]*sum;
}
}
for(int i=1;i<=m;i++)
{
printf("%d %d %d %d\n",a[x[i]],b[x[i]],c[x[i]],d[x[i]]);
}
//fclose(stdin);
//fclose(stdout);
return 0;
}
拜拜~