NOIP_PJT4:魔法阵

哈喽各位观众朋友们,小酱和大家又见面啦…
上期有同学在后台给我留言说:…
在这里插入图片描述
我懵了,我打成第四题啦??
好像还真是…
不好意思,我真打错了!
诚挚地向这位@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;
}

拜拜~

你可能感兴趣的:(信息学奥赛)