[NOIP2016PJ]魔法阵
今天模拟赛的题,,,唯一没有Giao出来的题(不然我就AKIOI了~)
最开始没想到数学题,把所有部分分都说一遍吧:
35分:纯暴力O(M^4)枚举,对于每一组a,b,c,d验证其是否合法。
60分:经过读题,不难发现a,b,c,d单调递增,可以考虑对其进行排序后再暴力枚举,枚举量减少近一半。
85分:对xb-xa=2(xd-xc)进行分析,可以得到以下公式:double((xb-xa+2xc)/2)=double(xd),再查找是否存在xd,这样我们只需枚举a,b,c,时间复杂度是O(M^3)
100分:依旧是对xb-xa=2(xd-xc)进行分析,我们设t=xd-xc,则xb-xa=2⋅t;再分析第二个条件Xb−Xa<(Xc−Xb)/3,我们可以得到Xc−Xb>6⋅t,我们给他补全成等号,就是Xc−Xb=6⋅t+k
所以这四个数在数轴上的排列如图所示(图片来自博客园)
所以我们会有一个不成熟的思路:在1-n/9范围内枚举t,把a,b,c,d拿t表示出来。
那么如何计算呢?枚举D。当我们枚举到一个D值的时候,与之对应的C值是确定的(不受k影响),而A值和B值却不一定。因此我们可以找到最大的与之对应的A值B值。
但是有可能会存在一组AB值要比当前计算到的小,怎么办呢?不妨设有可能存在的比最大值小的A值为A1,B值为B1,计算到的为A2和B2
当A1<A2&&B1<B2时,只要A2和B2能组成魔法阵,A1和B1一定可以(k只是大于0的数,而对k的上界没有限制,当我们把k放大时,就可以构造出A1和B1了)。
由于是顺序枚举,所以我们可以记录一下之前有多少组合法解(类似于前缀和),最后再用乘法原理计算。同样的方法,我们从A的上界往A的下界枚举记录后缀和然后计算即可。
下面给出参考代码:
// luogu-judger-enable-o2
#include<iostream>
#include<cstdio>
#include<cstring>
#define N 50005
#define M 50005
using namespace std;
int n,m,ans[M][],num[M],a[M],A,B,C,D;
int read()
{
int x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=;ch=getchar();}
while(ch>=''&&ch<=''){x=(x<<)+(x<<)+(ch^);ch=getchar();}
if(f)return x;return -x;
}
int main()
{
n=read();m=read();
for(int i=;i<=m;i++)
{
a[i]=read();
num[a[i]]++;
}
for(int t=;t*<n;t++)
{
int sum=;
for(D=*t+;D<=n;D++)
{
C=D-t;
B=C-*t-;
A=B-*t;
sum+=num[A]*num[B];
ans[C][]+=num[D]*sum;
ans[D][]+=num[C]*sum;
}
sum=A=B=C=D=;
for(A=n-t*-;A>=;A--)
{
B=A+*t;
C=B+*t+;
D=C+t;
sum+=num[C]*num[D];
ans[A][]+=num[B]*sum;
ans[B][]+=num[A]*sum;
}
}
for(int i=;i<=m;i++)
{
for(int j=;j<=;j++)
{
cout<<ans[a[i]][j]<<" ";
}
cout<<endl;
}
return ;
}
[NOIP2016PJ]魔法阵的更多相关文章
- 洛谷 P2119 魔法阵
题目描述 六十年一次的魔法战争就要开始了,大魔法师准备从附近的魔法场中汲取魔法能量. 大魔法师有mm个魔法物品,编号分别为1,2,...,m1,2,...,m.每个物品具有一个魔法值,我们用X_iXi ...
- [luogu2119]魔法阵 NOIP2016T4
很好的一道数学推导题 45分做法 $O(N^4)$暴力枚举四个材料 55分做法 从第一个约束条件可得到所有可行答案都是单调递增的,所以可以排序一遍,减少枚举量,可以拿到55分 100分做法 首先可以发 ...
- 【DFS】佳佳的魔法阵
[vijos1284]佳佳的魔法阵 背景 也许是为了捕捉猎物(捕捉MM?),也许是因为其它原因,总之,佳佳准备设计一个魔法阵.而设计魔法阵涉及到的最关键问题,似乎就是那些带有魔力的宝石的摆放…… 描述 ...
- 洛谷P2119 魔法阵
P2119 魔法阵 题目描述 六十年一次的魔法战争就要开始了,大魔法师准备从附近的魔法场中汲取魔法能量. 大魔法师有m个魔法物品,编号分别为1,2,...,m.每个物品具有一个魔法值,我们用Xi表示编 ...
- [NOIP2016普及组]魔法阵
题目:洛谷P2119.Vijos P2012.codevs5624. 题目大意:有n件物品,每件物品有个魔法值.要求组成魔法阵(Xa,Xb,Xc,Xd),该魔法阵要满足Xa<Xb<Xc&l ...
- P2119 魔法阵
原题链接 https://www.luogu.org/problemnew/show/P2119 YY同学今天上午给我们讲了这个题目,我觉得她的思路很好,特此写这篇博客整理一下. 50分:暴力枚举 ...
- 洛谷 题解 P2119【魔法阵】
很好的一道数学推导题 45分做法 \(O(N^4)\) 暴力枚举四个材料 55分做法 从第一个约束条件可得到所有可行答案都是单调递增的,所以可以排序一遍,减少枚举量,可以拿到55分 100分做法 首先 ...
- 题解 【NOIP2016】魔法阵
[NOIP2016]魔法阵 Description 六十年一次的魔法战争就要开始了,大魔法师准备从附近的魔法场中汲取魔法量. 大魔法师有m个魔法物品,编号分别为1,2,...,m.每个物品具有一个魔法 ...
- 「Vijos 1284」「OIBH杯NOIP2006第二次模拟赛」佳佳的魔法阵
佳佳的魔法阵 背景 也许是为了捕捉猎物(捕捉MM?),也许是因为其它原因,总之,佳佳准备设计一个魔法阵.而设计魔法阵涉及到的最关键问题,似乎就是那些带有魔力的宝石的摆放-- 描述 魔法阵是一个\(n ...
随机推荐
- docker可视化集中管理工具shipyard安装部署
docker可视化集中管理工具shipyard安装部署 Shipyard是在Docker Swarm实现对容器.镜像.docker集群.仓库.节点进行管理的web系统. 1.Shipyard功能 Sh ...
- 【改】linux中分区的概念
1.目录和分区 区别:Linux的分区是物理上的概念,从物理上将存储空间分开:Linux的目录是逻辑上的概念,Linux的目录树实际上是一个分区之间的数据逻辑结构关系,不是物理结构: 联系:一个分区必 ...
- 【学习】004 java并发包
并发包[jdk1.7] 同步容器类 Vector与ArrayList区别 1.ArrayList是最常用的List实现类,内部是通过数组实现的,它允许对元素进行快速随机访问.数组的缺点是每个元素之间不 ...
- 四种会话跟踪技术以及jstl介绍
四种会话跟踪技术 page:代表与一个页面相关的对象和属性.一个页面由一个编译好的 Java servlet 类(可以带有任何的 include 指令,但是没有 include 动作)表示.这既包括 ...
- LSTM 神经网络输入输出层
今天终于弄明白,TensorFlow和Keras中LSTM神经网络的输入输出层到底应该怎么设置和连接了.写个备忘. https://machinelearningmastery.com/how-to- ...
- Python3-unittest测试框架之DDT数据驱动
unittest测试框架之DDT数据驱动 ddt的使用 DDT数据驱动 DDT:Data Driver Test(数据驱动测试) 数据驱动思想:数据和用例进行分离,通过外部数据去生成测试用例 安装 p ...
- 简单的DOS攻击之死亡之ping详解
DOS攻击之死亡之ping详解,dos攻击,俗称拒绝服务攻击,通过发送大量的无用请求数据包给服务器,耗尽服务器资源,从而无法通过正常的访问服务器资源,导致服务器崩溃. 如果多个ip通过发起对一个服务器 ...
- python 文件读写操作打开模式
‘r’:只读.该文件必须已存在. ‘r+’:可读可写.该文件必须已存在,写为追加在文件内容末尾. ‘rb’:表示以二进制方式读取文件.该文件必须已存在. ‘w’:只写.打开即默认创建一个新文件,如果文 ...
- mybatis获取数据库自增id
http://blog.csdn.net/dyllove98/article/details/8866357 http://www.iteye.com/problems/86864 insert标签中 ...
- Ntdll.h
转自:https://www.cnblogs.com/gwsbhqt/p/5092390.html 为了能使用上Ntdll.lib库函数,从几份不完整的Ntdll.h中拼凑整理出了比较完整美观的Ntd ...