【NOIP普及组2016】魔法阵


@前言@

听闻老前辈们道这道题好像很难的样子,于是我就去做了……
然后我就TLE了
于是偷偷瞟了一眼大老前辈们的博客,发现这道题好像,还是枚举,只是有用到【数学方法】优化罢了
完了完了,一提到数学,我脑子里顿时腾起了层层云雾,所以最后决定还是来写写东西。


@题目描述@

六十年一次的魔法战争就要开始了,大魔法师准备从附近的魔法场中汲取魔法能量。
大魔法师有m个魔法物品,编号分别为 1 , 2 , . . . , m 1,2,...,m 1,2,...,m。每个物品具有一个魔法值,我们用Xi表示编号为i的物品的魔法值。每个魔法值Xi是不超过n的正整数,可能有多个物品的魔法值相同。
大魔法师认为,当且仅当四个编号为 a , b , c , d a,b,c,d a,b,c,d的魔法物品满足 x a &lt; x b &lt; x c &lt; x d , x b − x a = 2 ( x d − x c ) xa&lt;xb&lt;xc&lt;xd,xb-xa=2(xd-xc) xa<xb<xc<xdxbxa=2(xdxc),并且 x b − x a &lt; ( x c − x b ) / 3 xb-xa&lt;(xc-xb)/3 xbxa<(xcxb)/3时,这四个魔法物品形成了一个魔法阵,他称这四个魔法物品分别为这个魔法阵的A物品,B物品,C物品,D物品。
现在,大魔法师想要知道,对于每个魔法物品,作为某个魔法阵的A物品出现的次数,作为B物品的次数,作为C物品的次数,和作为D物品的次数。

输入
输入文件的第一行包含两个空格隔开的正整数n和m。
接下来m行,每行一个正整数,第i+1行的正整数表示Xi,即编号为i的物品的魔法值。
保证 1 ≤ n ≤ 150001 ≤ n ≤ 15000 , 1 ≤ m ≤ 400001 ≤ m ≤ 40000 , 1 ≤ X i ≤ n 1 ≤ X i ≤ n 1 \le n \le 150001≤n≤15000,1 \le m \le 400001≤m≤40000,1 \le Xi \le n1≤Xi≤n 1n150001n15000,1m400001m40000,1Xin1Xin。每个Xi是分别在合法范围内等概率随机生成的。

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

样例输入
输入样例#1:
30 8
1
24
7
28
5
29
26
24
输入样例#2:
15 15
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
样例输出
输出样例#1:
4 0 0 0
0 0 1 0
0 2 0 0
0 0 1 1
1 3 0 0
0 0 0 2
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

样例说明
样例#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。
以物品5为例,它作为A物品出现了1次,作为B物品出现了3次,没有作为C物品或者D物品出现,所以这一行输出的四个数依次为1,3,0,0。

此外,如果我们将输出看作一个m行4列的矩阵,那么每一列上的m个数之和都应等于魔法阵的总数。所以,如果你的输出不满足这个性质,那么这个输出一定不正确。你可以通过这个性质在一定程度上检查你的输出的正确性。

@题目分析-暴力枚举O(m^4)@

“这么简单,当然是暴力啦~”
于是一段清晰的思路像一片Sunshine:分别枚举 A , B , C , D A,B,C,D A,B,C,D,判断合法。
条件反射地想到,可以剪枝!在找 A , B , C , D A,B,C,D A,B,C,D及时判断是否合法,可以省去多多的状态。
然后写出来以后,突然瞟了一眼数据范围……
真是莫名其妙。
一段十分失败的枚举代码:

#include<cstdio>
int X[40005];
int ansA[40005],ansB[40005],ansC[40005],ansD[40005];
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值