【NOIP2016普及组复赛】魔法阵

题目

分析

设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]]);
}

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

时间: 2024-12-22 19:19:00

【NOIP2016普及组复赛】魔法阵的相关文章

NOIP2016普及组复赛解题报告

提高组萌新,DAY1DAY2加起来骗分不到300,写写普及组的题目聊以自慰. (附:洛谷题目链接 T1:https://www.luogu.org/problem/show?pid=1909 T2:https://www.luogu.org/problem/show?pid=2010 T3:https://www.luogu.org/problem/show?pid=2058 T4:https://www.luogu.org/problem/show?pid=2119) 不得不说,亲历了14.1

[NOIP2016普及组]魔法阵

题目:洛谷P2119.Vijos P2012.codevs5624. 题目大意:有n件物品,每件物品有个魔法值.要求组成魔法阵(Xa,Xb,Xc,Xd),该魔法阵要满足Xa<Xb<Xc<Xd,Xb-Xa=2(Xd-Xc),并且Xb-Xa<(Xc-Xb)/3.求每件物品作为a.b.c.d的次数. 解题思路:这真是一道锻炼思(bào)维(lì)能力的好(kēng)题! 首先枚举魔法阵的每件物品,姿势好可得65(洛谷测). 然后是强(wěi)大(suǒ)的正解. 首先利用桶排的思路保存各

[题解]noip2016普及组题解和心得

[前言] 感觉稍微有些滑稽吧,毕竟每次练的题都是提高组难度的,结果最后的主要任务是普及组抱一个一等奖回来.至于我的分数嘛..还是在你看完题解后写在[后记]里面.废话不多说,开始题解. 第一题可以说的内容不是很多吧.直接暴力,计算每种铅笔需要花费的金额. 只不过计算的时候,需要注意如下问题 如果不是整数倍,除完后要加1 神奇的Linux系统,很多人的第三个点wa了,所以要养成良好的编写代码的习惯 Code(我的源程序) 1 #include<iostream> 2 #include<fst

NOIP2016普及组

嗯,今年的普及组难度-- 题目链接:http://qscoj.cn/problem/55/ 买铅笔 时间限制: 1000ms   内存限制: 128M 描述 P老师需要去商店买n支铅笔作为小朋友们参加NOIP的礼物.她发现商店一共有 3种包装的铅笔,不同包装内的铅笔数量有可能不同,价格也有可能不同.为了公平起 见,P老师决定只买同一种包装的铅笔. 商店不允许将铅笔的包装拆开,因此P老师可能需要购买超过n支铅笔才够给小朋 友们发礼物. 现在P老师想知道,在商店每种包装的数量都足够的情况下,要买够至

NOIP 2015普及组复赛Day1 T1 == Codevs4510 神奇的幻方

时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题目描述 Description: 幻方是一种很神奇的N∗N矩阵:它由数字 1,2,3, … … ,N∗N构成,且每行.每列及两条对角线上的数字之和都相同. 当N为奇数时,我们可以通过以下方法构建一个幻方: 首先将 1写在第一行的中间.之后,按如下方式从小到大依次填写每个数(K= 2,3, … ,N∗N ): 1.若 (K−1)在第一行但不在最后一列,则将 填在最后一行,(K−1)所在列的右一列: 2.若 (K

noip2016 普及组

T1 买铅笔 题目传送门 #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int inf=0x3f3f3f3f; int read(){ int ans=0,f=1,c=getchar(); while(c<'0'||c>'9'){if(c=='-') f=-1; c=getchar();} while(c>='0'&&c

C++ P1318 Jam的计数法(NOIP2006普及组复赛第3题)

#include<iostream>#include<cstdio>using namespace std; int s,t,w,a[30],time=5;char c[30];bool ok;//ok表示是否找到规定集合: void data_in()//使用位向量法: { scanf("%d%d%d",&s,&t,&w); scanf("%s",c); for(int i=0;i<w;i++) a[c[i]-

05:统计单词数【NOIP2011复赛普及组第二题】

05:统计单词数 总时间限制:  1000ms 内存限制:  65536kB 描述 一般的文本编辑器都有查找单词的功能,该功能可以快速定位特定单词在文章中的位置,有的还能统计出特定单词在文章中出现的次数. 现在,请你编程实现这一功能,具体要求是:给定一个单词,请你输出它在给定的文章中出现的次数和第一次出现的位置.注意:匹配单词时,不区分大小写,但要求完全匹配,即给定单词必须与文章中的某一独立单词在不区分大小写的情况下完全相同(参见样例1),如果给定单词仅是文章中某一单词的一部分则不算匹配(参见样

洛谷P2119 魔法阵

题目描述 六十年一次的魔法战争就要开始了,大魔法师准备从附近的魔法场中汲取魔法能量. 大魔法师有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时,这四个魔法物品形成了一个魔法阵,他称这四个魔法物品分别为这个魔法阵的