原题链接  https://www.luogu.org/problemnew/show/P2119

YY同学今天上午给我们讲了这个题目,我觉得她的思路很好,特此写这篇博客整理一下。

50分:暴力枚举

四重 for 循环分别枚举每个物品作为A物品,B物品,C物品,D物品的情况,看看能否满足题目中给出的三个式子,满足的话对应物品的次数加一就好啦;

100分:数学做法

我们回过头来看上面的三个式子:

对于第一个式子,我们可以按照魔法值从低到高来选择物品;

由第二,三个式子我们可以得到:

我们可以画一个数轴来表示物品A,B,C,D的位置,应该是长这个样子的(by YY):

考虑枚举t

由于物品的魔法值只能取整数,所以通过上述的关系我们可以通过枚举 t 来求出魔法物品出现的次数。

考虑枚举范围:

考虑到AD>9t 且AD<=n,所以 9t < n;

我们已经知道AB=2t,CD=t,但是我们都不知道A,B,C,D的位置在哪里,那么怎么办呢?

我们可以分别枚举A和B中的一个,C和D中的一个,然后再利用上面的关系式求出另外一个;

考虑枚举D(这里是魔法值)

考虑枚举范围:

考虑到 A 最小为1,且AD>9t,所以D得位置要大于 9t+1,即我们要从 9t+2 开始枚举D;

有了D的位置,C的位置我们可以通过 D - t 推出来,但是由于 BC>6t,并没有具体的数值,我们还是不能确定B的位置;

又因为使A,B,C,D满足条件的k的最小值为1,所以对于当前的C和D,最大的A和B为A=D−9t−1,B=D−7t−1

那么如果A和B更小怎么办?

观察到在其他条件不变的情况下,只要C和B满足Xc−Xb>6t,那么这个魔法阵就一定成立,所以当(a1<a2,b1<b2)时,只要a2和b2能够和C,D组成魔法阵,a1,b1也一定能和C,D组成魔法阵,所以可以使用前缀和优化;

然后又由乘法原理可得,当前魔法值作为D物品的个数为SumD=SumA*SumB*SumC

所以我们利用前缀和优化SumA*SumB

C的情况可以顺便在算D的时候算出来

同理我们枚举A

但是和我们刚刚枚举D的情况也有些不同,

在其他条件不变的情况下,只要C和B满足Xc−Xb>6t,那么这个魔法阵就一定成立,所以当(c1<c2,d1<d2)时,只要c1和d1能够和A,B组成魔法阵,c2,d2也一定能和A,B组成魔法阵,所以可以使用后缀和优化

因为需要统计后缀和,所以需要逆推

考虑枚举范围:

考虑到D需要<=n,而D>A+9t,所以A的最大上限就是:n - 9t -1;

因为需要逆推求后缀和,所以我们倒着枚举;

输出

输出的时候我们只需要输出第 i 个物品的魔法值作为物品A,B,C,D的次数就好啦;

特殊情况

因为我们的D>A+9t,而我们又知道A的最小值是1,t 的最小值是1,换过来就是:D>10,所以就是n最小得是11,要不然我们就找不到符合条件的D了;

#include<iostream>
#include<cstdio>
using namespace std;
int n,m,sum;
int A,B,C,D;
int num[],X[];
int a[],b[],c[],d[];
/*
a[i]魔法值为 i 的物品作为魔法阵的A物品的次数
b[i]魔法值为 i 的物品作为魔法阵的B物品的次数
c[i]魔法值为 i 的物品作为魔法阵的C物品的次数
d[i]魔法值为 i 的物品作为魔法阵的D物品的次数
*/
int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=m;i++) scanf("%d",&X[i]),num[X[i]]++;
if(n<) //特判
{
for(int i=;i<=m;i++)
printf("0 0 0 0\n"); //无解的情况
return ;
}
for(int t=;*t<n;t++) //t一定要在最外层
{
sum=;
for(D=*t+;D<=n;D++) //顺着枚举D
{
C=D-t; //算A,B,C
B=C-*t-;
A=B-*t;
sum+=num[A]*num[B]; //维护前缀和
c[C]+=sum*num[D]; //算出C和D的情况
d[D]+=sum*num[C];
}
sum=;
for(int A=n-*t-;A;A--) //同理倒着枚举A
{
B=A+*t;
C=B+*t+;
D=C+t;
sum+=num[C]*num[D];
a[A]+=sum*num[B];
b[B]+=sum*num[A];
}
}
for(int i=;i<=m;i++) printf("%d %d %d %d\n",a[X[i]],b[X[i]],c[X[i]],d[X[i]]); //输出对应得魔法值的次数
}

P2119 魔法阵的更多相关文章

  1. 洛谷P2119 魔法阵

    P2119 魔法阵 题目描述 六十年一次的魔法战争就要开始了,大魔法师准备从附近的魔法场中汲取魔法能量. 大魔法师有m个魔法物品,编号分别为1,2,...,m.每个物品具有一个魔法值,我们用Xi表示编 ...

  2. 洛谷 P2119 魔法阵

    题目描述 六十年一次的魔法战争就要开始了,大魔法师准备从附近的魔法场中汲取魔法能量. 大魔法师有mm个魔法物品,编号分别为1,2,...,m1,2,...,m.每个物品具有一个魔法值,我们用X_iXi ...

  3. 【做题记录】[NOIP2016 普及组] 魔法阵

    P2119 魔法阵 2016年普及组T4 题意: 给定一系列元素 \(\{X_i\}\) ,求满足以下不等式的每一个元素作为 \(a,b,c,d\) 的出现次数 . \[\begin{cases}X_ ...

  4. 洛谷 题解 P2119【魔法阵】

    很好的一道数学推导题 45分做法 \(O(N^4)\) 暴力枚举四个材料 55分做法 从第一个约束条件可得到所有可行答案都是单调递增的,所以可以排序一遍,减少枚举量,可以拿到55分 100分做法 首先 ...

  5. [NOIP2016普及组]魔法阵

    题目:洛谷P2119.Vijos P2012.codevs5624. 题目大意:有n件物品,每件物品有个魔法值.要求组成魔法阵(Xa,Xb,Xc,Xd),该魔法阵要满足Xa<Xb<Xc&l ...

  6. [luogu2119]魔法阵 NOIP2016T4

    很好的一道数学推导题 45分做法 $O(N^4)$暴力枚举四个材料 55分做法 从第一个约束条件可得到所有可行答案都是单调递增的,所以可以排序一遍,减少枚举量,可以拿到55分 100分做法 首先可以发 ...

  7. 【DFS】佳佳的魔法阵

    [vijos1284]佳佳的魔法阵 背景 也许是为了捕捉猎物(捕捉MM?),也许是因为其它原因,总之,佳佳准备设计一个魔法阵.而设计魔法阵涉及到的最关键问题,似乎就是那些带有魔力的宝石的摆放…… 描述 ...

  8. 题解 【NOIP2016】魔法阵

    [NOIP2016]魔法阵 Description 六十年一次的魔法战争就要开始了,大魔法师准备从附近的魔法场中汲取魔法量. 大魔法师有m个魔法物品,编号分别为1,2,...,m.每个物品具有一个魔法 ...

  9. [NOIP2016PJ]魔法阵

    今天模拟赛的题,,,唯一没有Giao出来的题(不然我就AKIOI了~) 最开始没想到数学题,把所有部分分都说一遍吧: 35分:纯暴力O(M^4)枚举,对于每一组a,b,c,d验证其是否合法. 60分: ...

随机推荐

  1. 面试经典算法:马拉松算法,最长回文子串Golang实现

    求一个字符串中最长的回文子串. package main import "fmt" /* 马拉松算法,求最长回文子串,时间复杂度:线性 */ func main() { // 回文 ...

  2. (七)Activiti之历史活动查询和历史任务查询和流程状态查询

    一.历史活动查询 本章案例是基于上一章节案例的基础上,流程走完后进行测试的,也就是下图的流程从学生请假到班主任审批都已经完成,本章用来测试查询历史活动和历史任务的 activiti5的历史活动包括所有 ...

  3. HTTP抓包

    1 概述 wireshark:全平台抓包工具,需要图形化界面,十分强大: httpry:http抓包插件,功能一般,操作简单: tcpdump:强大的抓包插件,支持多种网络协议. 2 httpry ( ...

  4. HTTP协议探究(六):H2帧详解和HTTP优化

    一 复习与目标 1 复习 HTTP1.1存在的问题 HTTP2.0要兼容HTTP1.1 HTTP2.0的重要概念 分帧层 二进制:流 消息 帧 流的状态.优先级和并发 流量控制 服务器推送 首部压缩 ...

  5. Java 18套JAVA企业级大型项目实战分布式架构高并发高可用微服务电商项目实战架构

    Java 开发环境:idea https://www.jianshu.com/p/7a824fea1ce7 从无到有构建大型电商微服务架构三个阶段SpringBoot+SpringCloud+Solr ...

  6. Map集合中key不存在时使用toString()方法、valueOf()方法和强制转换((String))之间的区别

    1.toString()方法 底层代码 public String toString() { return this; } 其返回值为String类型的字符串本身 Map<String, Obj ...

  7. 使用帅气的cordic算法进行坐标系互转及log10的求解

    参考博客 https://blog.csdn.net/u010712012/article/details/77755567 https://blog.csdn.net/Reborn_Lee/arti ...

  8. string+DFS leetcode-17.电话号码下的字母组合

    题面 Given a string containing digits from 2-9 inclusive, return all possible letter combinations that ...

  9. 使用apache的HttpClient进行http通讯,隐藏的HTTP请求头部字段是如何自动被添加的

    我们用apache的HttpClient这个库消费云端的Restful API时,一般都需要两次HTTP调用,第一次获得某种token,比如获取防止跨域请求伪造攻击Cross-site request ...

  10. zabbix-自定义监控项

    一.自定义一个监控项 模板虽好,但是不能解决所有的监控,有些需要的监控项在模板中并没有,需要我们自己定义一个监控项,如何定义一个监控项呢?大概的流程是这样的几步 .在插件配置文件中定义一个key/va ...