码迷,mamicode.com
首页 > 其他好文 > 详细

【NOIP2016普及组复赛】魔法阵

时间:2018-05-21 14:33:26      阅读:147      评论:0      收藏:0      [点我收藏+]

标签:algo   src   scan   题目   根据   pre   csdn   前缀和   stream   

题目

技术分享图片

分析

设xd-xc为i,那么xb-xa=2i,
又因为xb-xa<(xc-xb)/3,
那么c>6i+b。
于是,先枚举i,
再分别枚举xa和xd,
根据之间的关系,用前缀和求出每一种魔法阵的每一种物品的次数。

#include <cmath>
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <queue>
const int maxlongint=2147483647;
const int mo=1000000007;
const int N=50005;
using namespace std;
int n,m,val[N],w[N],a[N],b[N],c[N],d[N];
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",&val[i]);
        w[val[i]]++;
    }
    for(int i=1;i<=n/9;i++)
    {
        int num=0;
        for(int xa=n-9*i-1;1<=xa;xa--)
        {
            int xd=xa+9*i+1,xc=xa+8*i+1,xb=xa+2*i;
            num+=w[xd]*w[xc];
            a[xa]+=w[xb]*num;
            b[xb]+=w[xa]*num;
        }
        num=0;
        for(int xd=9*i+2;xd<=n;xd++)
        {
            int xc=xd-i,xb=xd-7*i-1,xa=xd-9*i-1;
            num+=w[xa]*w[xb];
            d[xd]+=w[xc]*num;
            c[xc]+=w[xd]*num;
        }
    }
    for(int i=1;i<=m;i++)
        printf("%d %d %d %d\n",a[val[i]],b[val[i]],c[val[i]],d[val[i]]);
}

【NOIP2016普及组复赛】魔法阵

标签:algo   src   scan   题目   根据   pre   csdn   前缀和   stream   

原文地址:https://www.cnblogs.com/chen1352/p/9066594.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!