【NOIP2016】魔法阵

Description

六十年一次的魔法战争就要开始了,大魔法师准备从附近的魔法场中汲取魔法量。
大魔法师有m个魔法物品,编号分别为1,2,...,m。每个物品具有一个魔法值,我们用xi表示编号为i的物品的魔法值。每个魔法值xi是不超过n的正整数,可能有多个物品的魔法值相同。

他称这四个魔法物品分别为这个魔法阵的A物品,B物品,C物品,D物品。
现在,大魔法师想要知道,对于每个魔法物品,作为某个魔法阵的A物品出现的次数,作为B物品的次数,作为C物品的次数,和作为D物品的次数。

Input

第一行包含两个空格隔开的正整数n和m
接下来m行,每行一个正整数,第i+1行的正整数表示x},即编号为i的物品的魔法值。
保证1 <= n <= 15000,1 <= m <= 40000,1 <= xi <= n。每个xi是分别在合法范围内等概率随机生成的。

Output

共输出m行,每行四个整数。第i行的四个整数依次表示编号为i的物品作为A,B,C,D物品分别出现的次数。
保证标准输出中的每个数都不会超过10^9
每行相邻的两个数之间用恰好一个空格隔开。

Sample Input

输入样例1:
30 8
1
24
7
28
5
29
26
24

输入样例2:
15 15
1
2
3
4
5
6
7
8
9
1
11
12
13
14
15

Sample Output

输出样例1:
4 0 0 0
0 0 1 0
0 2 0 0
0 0 1 1
1 3 0 0
0 0 2 0
0 0 2 2
0 0 1 0

输出样例2:
5 0 0 0
4 0 0 0
3 5 0 0
2 4 0 0
1 3 0 0
0 2 0 0
0 1 0 0
0 0 0 0
0 0 0 0
0 0 1 0
0 0 2 1
0 0 3 2
0 0 4 3
0 0 5 4
0 0 0 5

Hint

输入样例1提示:
共有5个魔法阵,分别为:
物品1,3,7,6,其魔法值分别为1, 7, 26, 29;
物品1,5,2,7,其魔法值分别为1, 5, 24, 26;
物品1,5,7,4,其魔法值分别为1, 5, 26, 28;
物品1,5,8,7,其魔法值分别为1, 5, 24, 26;
物品5,3,4,6,其魔法值分别为5, 7, 28, 29 0
以物品_5为例,它作为A物品出现了1次,作为B物品出现了3次,没有作为C物品或者D物品出现,所以这一行输出的四个数依次为1,3,0,0 0
此外,如果我们将输出看作一个m行4列的矩阵,那么每一列上的m个数之和都应等于魔法阵的总数。所以,如果你的输出不满足这个性质,那么这个输出一定不正确。你可以通过这个性质在一定程度上检查你的输出的正确性。

数据范围:

Source

NOIP2016普及组
动态规划

解析

这题用暴力特别好写。

但时间复杂度会炸啊啊啊!!!

所以我们要考虑优化。

首先,想想n是干什么的?

没错,我们可以用桶排!

用d[i]记录i魔法值为i的物品个数。

然后,再考虑一下解法:

先看下图(图片来自网络(真的画不出来)):

当d-c等于t时,各点之间的距离就如上图。

所以,确定d的位置后,c的位置也就确定了。

而对于一对确定的c,d,

能够于它们组成魔法阵的a,b的组数为∑(d[ai]*d[bi])(ai,bi为满足条件的魔法值)。

因此,我们还能用前缀和优化。

因为当t一定时,若一对(a,b)满足条件,则a,b之前的所有差值为2×t的魔法值都一定满足条件。

最后,c的组数就等于(a,b的组数)×魔法值为d的物品个数(d也一样)。

于是我们枚举d的值,再一边递推就行了。

最后,同理,枚举a的位置,计算满足条件的c,d组数,就可以AC了!(注意,a要倒着枚举,因为c,d是从后往前递推的。)

上AC代码(如果前面不太懂可以看代码理解):

#include <bits/stdc++.h>
using namespace std; int n,m;
int a[];
int f[][]/*作为第i个物品时,魔法值为j的次数*/;
int d[]/*魔法值为i的物品个数*/;
int sum=,cnt=; int main(){
memset(f,,sizeof(f));
scanf("%d%d",&n,&m);
for(int i=;i<=m;i++){
scanf("%d",&a[i]);
d[a[i]]++;
}
for(int t=;t*+<=n;t++){
sum=;cnt=;
for(int dd=*t+;dd<=n;dd++){
int cc=dd-t;//第三个物品
int bb=cc-*t-;//第二个物品
int aa=bb-*t;//第一个物品
sum+=d[aa]*d[bb];//递推计算前缀和
f[][cc]+=sum*d[dd];//魔法值为d的个数可能不是/不止1个
f[][dd]+=sum*d[cc];//同理
}
for(int aa=n-*t-;aa>=;aa--){
int bb=aa+*t;//第二个物品
int cc=bb+*t+;//第三个物品
int dd=cc+t;//第四个物品
cnt+=d[cc]*d[dd];
f[][aa]+=cnt*d[bb];
f[][bb]+=cnt*d[aa];
}
}
for(int i=;i<=m;i++){
for(int j=;j<=;j++){
printf("%d ",f[j][a[i]]);
}
printf("\n");
}
return ;
}

题解 【NOIP2016】魔法阵的更多相关文章

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

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

  2. [NOIP2016普及组]魔法阵

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

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

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

  4. [luogu2119]魔法阵 NOIP2016T4

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

  5. 洛谷 P2119 魔法阵

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

  6. 【DFS】佳佳的魔法阵

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

  7. 洛谷P2119 魔法阵

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

  8. P2119 魔法阵

    原题链接  https://www.luogu.org/problemnew/show/P2119 YY同学今天上午给我们讲了这个题目,我觉得她的思路很好,特此写这篇博客整理一下. 50分:暴力枚举 ...

  9. [NOIP2016PJ]魔法阵

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

随机推荐

  1. Spring MVCD框架中调用HanLP分词的方法

    项目简要:关于java web的一个项目,用的Spring MVCd 框架.鉴于参与此次项目的人中并不是所人都做的Spring,为了能够提高效率,建议大家是先抛开SPring来写自己负责的模块,最后再 ...

  2. 服务器:消息18456,级别16,状态1 用户‘sa’登录失败解决方法

    无法连接到服务器**:  服务器:消息18456,级别16,状态1   [Microsoft][ODBC   SQL   Server   Driver][Sql   server]   用户 'sa ...

  3. VMware虚拟机下安装CentOS 6.10并配置访问外网

    VMware安装包以及CentOS 6.5安装包 链接:https://pan.baidu.com/s/1wQi5GSgp4klXhtd84aoMSA 提取码:9l5y 链接:https://pan. ...

  4. 小菜鸟之HTML第三课

    jquery的引入 <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...

  5. oracle报:ORA-01034和ORA-27101的解决办法

    出现ORA-01034和ORA-27101的原因是多方面的:主要是oracle当前的服务不可用,shared memory realm does not exist,是因为oracle没有启动或没有正 ...

  6. PAT A1005 Spell It Right (20)

    书中AC代码 #include <cstdio> #include <cstring> #include <iostream> char num[10][10] = ...

  7. mysql在B-Tree上创建伪哈希索引

    构建哈希的过程 select过程 长字符串下,构建索引可通过自定义哈希作为索引,本人通过实验,在3百多个数据记录的下,性能效果很明显,完全不是一个等级.以下为索引前后几种情况对比 无索引的url:直接 ...

  8. HTTP、HTTPS、WebSocket

    一 .HTTP 1.1 HTTP发展史 1.1.1 什么是HTTP 超文本传输协议,是一个基于请求与响应,无状态的,应用层的协议,常基于TCP/IP协议传输数据,互联网上应用最为广泛的一种网络协议,所 ...

  9. 2 - sat 模板(自用)

    2-sat一个变量两种状态符合条件的状态建边找强连通,两两成立1 - n 为第一状态(n + 1) - (n + n) 为第二状态 例题模板 链接一  POJ 3207 Ikki's Story IV ...

  10. 进阶Java编程(11)ClassLoader类加载器【待完成】

    1,ClassLoader类加载器简介 在Java里面提供一个系统的环境变量:ClassPath,这个属性的作用主要是在JVM进程启动的时候进行类加载路径的定义,在JVM里面可以根据类加载器而后进行指 ...