题解 【NOIP2016】魔法阵
【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】魔法阵的更多相关文章
- 【做题记录】[NOIP2016 普及组] 魔法阵
P2119 魔法阵 2016年普及组T4 题意: 给定一系列元素 \(\{X_i\}\) ,求满足以下不等式的每一个元素作为 \(a,b,c,d\) 的出现次数 . \[\begin{cases}X_ ...
- [NOIP2016普及组]魔法阵
题目:洛谷P2119.Vijos P2012.codevs5624. 题目大意:有n件物品,每件物品有个魔法值.要求组成魔法阵(Xa,Xb,Xc,Xd),该魔法阵要满足Xa<Xb<Xc&l ...
- 洛谷 题解 P2119【魔法阵】
很好的一道数学推导题 45分做法 \(O(N^4)\) 暴力枚举四个材料 55分做法 从第一个约束条件可得到所有可行答案都是单调递增的,所以可以排序一遍,减少枚举量,可以拿到55分 100分做法 首先 ...
- [luogu2119]魔法阵 NOIP2016T4
很好的一道数学推导题 45分做法 $O(N^4)$暴力枚举四个材料 55分做法 从第一个约束条件可得到所有可行答案都是单调递增的,所以可以排序一遍,减少枚举量,可以拿到55分 100分做法 首先可以发 ...
- 洛谷 P2119 魔法阵
题目描述 六十年一次的魔法战争就要开始了,大魔法师准备从附近的魔法场中汲取魔法能量. 大魔法师有mm个魔法物品,编号分别为1,2,...,m1,2,...,m.每个物品具有一个魔法值,我们用X_iXi ...
- 【DFS】佳佳的魔法阵
[vijos1284]佳佳的魔法阵 背景 也许是为了捕捉猎物(捕捉MM?),也许是因为其它原因,总之,佳佳准备设计一个魔法阵.而设计魔法阵涉及到的最关键问题,似乎就是那些带有魔力的宝石的摆放…… 描述 ...
- 洛谷P2119 魔法阵
P2119 魔法阵 题目描述 六十年一次的魔法战争就要开始了,大魔法师准备从附近的魔法场中汲取魔法能量. 大魔法师有m个魔法物品,编号分别为1,2,...,m.每个物品具有一个魔法值,我们用Xi表示编 ...
- P2119 魔法阵
原题链接 https://www.luogu.org/problemnew/show/P2119 YY同学今天上午给我们讲了这个题目,我觉得她的思路很好,特此写这篇博客整理一下. 50分:暴力枚举 ...
- [NOIP2016PJ]魔法阵
今天模拟赛的题,,,唯一没有Giao出来的题(不然我就AKIOI了~) 最开始没想到数学题,把所有部分分都说一遍吧: 35分:纯暴力O(M^4)枚举,对于每一组a,b,c,d验证其是否合法. 60分: ...
随机推荐
- 分词搜索 sphinx3.1.1+php+mysql
sphinx3.1.1的安装与使用 下载sphinx3.1.1 wget http://sphinxsearch.com/files/sphinx-3.1.1-612d99f-linux-amd64. ...
- MySQL如何利用索引优化ORDER BY排序语
MySQL索引通常是被用于提高WHERE条件的数据行匹配或者执行联结操作时匹配其它表的数据行的搜索速度. MySQL也能利用索引来快速地执行ORDER BY和GROUP BY语句的排序和分组操作. 通 ...
- 初识WSGI接口
WSGI WSGI全称为Web Server Gateway Interface,WSGI允许web框架和web服务器分开,可以混合匹配web服务器和web框架,选择一个适合的配对.比如,可以在Gun ...
- spring 的工厂类
spring 的工厂类 1. 工厂类 BeanFactory 和 ApplicationContext 的区别. ApplicationContext 是 BeanFactory 的子接口,提供了比父 ...
- Scala学习七——包和引入
一.本章要点 包也可也可以像内部类那样嵌套 包路径不是绝对路径 包声明链x.y.z并不自动将中间包x和x.y变成可见 位于文件顶部不带花括号的包声明在整个文件范围内有效 包对象可以持有函数和变量 引入 ...
- 进阶Java编程(10)反射与简单Java类
1,传统属性自动赋值弊端 简单Java类主要由属性构成,并且提供有setter与getter类,同时简单Java类最大的特征就是通过对象保存相应的类属性的内容.但是如果使用传统的简单Java类开发,那 ...
- TVM调试指南
1. TVM安装 这部分之前就写过,为了方便,这里再复制一遍. 首先下载代码 git clone --recursive https://github.com/dmlc/tvm 这个地方最好使用--r ...
- 浅谈RPC框架
RPC(Remote Promote Call) RPC(Remote Promote Call):一种进程间通信方式.允许像调用本地服务一样调用远程服务. RPC框架的主要目标就是让远程服务调用更简 ...
- 4.ID主键生成策略
保证唯一性(auto_increment) 一.xml方式 <?xml version="1.0"?> <!DOCTYPE hibernate-mapping P ...
- 解决IDEA报错Could not autowire. There is more than one bean of 'xxx' type
更新项目之后IDEA突然出现了这样的报错信息.显示Could not autowire. There is more than one bean of 'xxx' type.这个错误的意思是xxx类型 ...