题目描述

六十年一次的魔法战争就要开始了,大魔法师准备从附近的魔法场中汲取魔法能量。

大魔法师有m个魔法物品,编号分别为1,2,…,m。每个物品具有一个魔法值,我们用Xi表示编号为i的物品的魔法值。每个魔法值Xi是不超过n的正整数,可能有多个物品的魔法值相同。

大魔法师认为,当且仅当四个编号为a,b,c,d的魔法物品满足xa<xb<xc<xd,xb−xa=2(xd−xc),并且xb−xa<(xc−xb)/3xa时,这四个魔法物品形成了一个魔法阵,他称这四个魔法物品分别为这个魔法阵的A物品,B物品,C物品,D物品。

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

输入输出格式

输入格式:
输入文件的第一行包含两个空格隔开的正整数n和m。

接下来m行,每行一个正整数,第i+1行的正整数表示Xi,即编号为i的物品的魔法值。

保证每个Xi是分别在合法范围内等概率随机生成的。

输出格式:
共输出m行,每行四个整数。第i行的四个整数依次表示编号为i的物品作 为A,B,C,D物品分别出现的次数。

保证标准输出中的每个数都不会超过10^9。

每行相邻的两个数之间用恰好一个空格隔开。

输入输出样例

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

题解

对于一道普及组的题目来说,这道题的难度还是有点大的
首先要读懂题,题目中有大写X和小写x,(在上面我已经改了),其实是一样的,可能会有人因此混淆

列出条件
1.xa<xb<xc<xdxa
2.xb−xa=2(xd−xc)xb-xa=2(xd-xc)
3.xb−xa<(xc−xb)/3xb-xa


先考虑稍微暴力点的方法
对于第一个条件,直接将所有东西存进一个桶里,桶的大小不会超过N(15000),每次不是枚举第几个魔法值,而是枚举魔法值
第二个条件的意思是后前两个数的差等于后两个数的差的两倍
可以利用条件三加一个小优化,这样在统计答案的时候也就不用判断是否满足条件三了
设后两个数的差为jj
xb−xa<(xc−xb)/3xb-xa
2∗j<(xc−xb)/32*j
6∗j<xc−xb6*j
xc>xb+6∗jxc>xb+6*j
这样,在枚举xc的时候就从6∗j+xb+16*j+xb+1开始枚举就行了
那么就可以考虑枚举后两个数的差,可以算出前两个数的差,再枚举xa算出xb,枚举xc算出xd然后统计答案
如何统计答案?
详细来说,设t[x]表示x这个值有多少个,设ans[x][1 4]ans[x][1~4]表示x这个数作为第一个道第四个数出现了几次,那么
ans[xa][1]=t[xb]∗t[xc]∗t[xd]ans[xa][1]=t[xb]*t[xc]*t[xd]
ans[xb][2]=t[xa]∗t[xc]∗t[xd]ans[xb][2]=t[xa]*t[xc]*t[xd]
ans[xc][3]=t[xa]∗t[xb]∗t[xd]ans[xc][3]=t[xa]*t[xb]*t[xd]
ans[xd][4]=t[xb]∗t[xc]∗t[xd]ans[xd][4]=t[xb]*t[xc]*t[xd]
输出时对于每个输入的魔法值x,输出ans[x][1],ans[x][2],ans[x][3],ans[x][4]ans[x][1],ans[x][2],ans[x][3],ans[x][4]
预计得分:60~85


考虑优化
同样先枚举后两个数的差jj
那么对于xa=0的时候,另外三个数的最小值为:
xb=2∗jxb=2*j
xc=8∗j+1xc=8*j+1
xc=9∗j+1xc=9*j+1
是根据三个条件得出的
每次只需枚举xa,算答案的时候对于前两个数直接加上后两个数所有的可能情况之和,对于后两个数直接加上前两个数所有可能的情况之和

如何求呢?

用sum1记录从最小的xa(值为1)到当前的xa和所对应的xb的∑t[xa]∗t[xb]\sum t[xa]*t[xb]
即sum1=∑t[xa]∗t[xb]sum1=\sum t[xa]*t[xb]
类似,用sum2记录xd从当前xa可能的最小值(xd=xa+9*j+1)到最大xd(xd=n)和所对应xc的∑t[xc]∗t[xd]\sum t[xc]*t[xd]
即sum2=∑t[xc]∗t[xd]sum2=\sum t[xc]*t[xd]
那么
ans[xa][1]=t[xb]∗sum2ans[xa][1]=t[xb]*sum2
ans[xb][2]=t[xa]∗sum2ans[xb][2]=t[xa]*sum2
ans[xc][3]=t[xd]∗sum1ans[xc][3]=t[xd]*sum1
ans[xd][4]=t[xc]∗sum1ans[xd][4]=t[xc]*sum1
不理解的话可以在我的代码中看一看

代码

#include<cstdio>
#include<cstring>
#include<algorithm>
#define fo(i,a,b) for(int i=a;i<=b;i++)
#define N 41000
using namespace std;
int n,m,e[N],t[N],ans[N][4];
void read(int &x)
{char c;c=getchar();int n=0;for(;c<'0'||c>'9';c=getchar());for(;c>='0'&&c<='9';c=getchar()) n=n*10+c-48;x=n;
}
int main()
{freopen("magic.in","r",stdin);freopen("magic.out","w",stdout);read(n);read(m);fo(i,1,m) read(e[i]),t[e[i]]++;int b,c,d;fo(j,1,2000){b=2*j;c=8*j+1;d=c+j;int sum=0,sum2=0;fo(i,d+1,n) sum+=t[i]*t[i-j];fo(a,1,n){b++;c++;d++;sum2+=t[a]*t[b];if(d>n) break;if(t[a]*t[b]>0){ans[a][0]+=t[b]*sum;ans[b][1]+=t[a]*sum;}if(t[c]*t[d]>0){ans[c][2]+=t[d]*sum2;ans[d][3]+=t[c]*sum2;}sum-=t[d]*t[c];}}fo(i,1,m) printf("%d %d %d %d\n",ans[e[i]][0],ans[e[i]][1],ans[e[i]][2],ans[e[i]][3]);
}

NOIP2016 普及组第四题 魔法阵magic 题解相关推荐

  1. NOIP2016普及组第四题——魔法阵

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

  2. NOIP2016普及组复赛第一题的AC程序加题解pascal

    P老师需要去商店买n支铅笔作为小朋友们参加NOIP的礼物.她发现商店一共有 3种包装的铅笔,不同包装内的铅笔数量有可能不同,价格也有可能不同.为了公平起 见,P老师决定只买同一种包装的铅笔.商店不允许 ...

  3. Noip2015普及组第四题 Salesman的解题报告

    [题意分析] 咋一看,这一题可以用贪心做,但是,时间复杂度是O(n*n),只能过60%的数据. [贪心算法](超时,60分) #include<cstdio> #include<cs ...

  4. NOIP2016普及组第三题——海港

    题目描述 小K是一个海港的海关工作人员,每天都有许多船只到达海港,船上通常有很多来自不同国家的乘客. 小K对这些到达海港的船只非常感兴趣,他按照时间记录下了到达海港的每一艘船只情况:对于第i艘到达的船 ...

  5. 洛谷 P1070 道路游戏(noip 2009 普及组 第四题)

    题目描述 小新正在玩一个简单的电脑游戏. 游戏中有一条环形马路,马路上有 nn个机器人工厂,两个相邻机器人工厂之间由一小段马路连接.小新以某个机器人工厂为起点,按顺时针顺序依次将这 nn个机器人工厂编 ...

  6. 子矩阵(NOIP2014 普及组第四题)

    描述 给出如下定义: 子矩阵:从一个矩阵当中选取某些行和某些列交叉位置所组成的新矩阵(保持行与 列的相对顺序)被称为原矩阵的一个子矩阵. 例如,下面左图中选取第 2.4 行和第 2.4.5 列交叉位置 ...

  7. NOIP2016普及组复赛第一题——买铅笔

    程序如下: var i,n,m:longint;   a:array[0..3,0..2]of longint; begin   m:=maxlongint;   readln(n);   for i ...

  8. 2002普及组第四题过河卒

    题目描述 如图,A 点有一个过河卒,需要走到目标 B 点.卒行走规则:可以向下.或者向右.同时在棋盘上的任一点有一个对方的马(如上图的C点),该马所在的点和所有跳跃一步可达的点称为对方马的控制点.例如 ...

  9. NOIP2016 普及组 总结+题目吐槽+代码+简单题解

    提高组回来之后,像往年一样,做了一下普及组的题 先吐槽一下 T1 这题一眼看上去以为可以用不同种类的铅笔,没想到只能用一种种类,我240B搞定 #include<cstdio> int m ...

最新文章

  1. Ubuntu下编译ffmpeg+openh264+x264
  2. 教育机构如何提升在线教育技术能力? | 云+社区技术沙龙
  3. 在Marketplace上销售应用【WP7学习札记之十八】
  4. 无法打开包括文件:“mysql..h”: No such file or directory
  5. SiameseRPN详解
  6. mongoshake同步mongodb数据到kafka
  7. python获取pc微信好友列表_python使用itchat获取微信好友列表
  8. JDBC和servlet设计思路、DAO模式思路、MVC思路粗略总结
  9. Out of resources when opening file './xxx.MYD' (Errcode: 24)解决方法
  10. Java9 新特性 详解
  11. Angular2的input和output(原先的properties和events)
  12. CSS生日快乐:CSS之父Håkon Wium Lie访谈录
  13. 离散题目13(判断自反关系)
  14. 百万奖补!2022年湖北省双创战略团队申报条件、材料和支持奖补
  15. 微服务框架之微软Service Fabric
  16. EXCEL如何从地址中提取省、市、区
  17. JS编写的医疗DICOM影像浏览工具
  18. 【直流无刷电机与永磁同步电机有什么区别?】
  19. TOMCAT下ab测试出现超时的解决
  20. 修复GRUB:win10 1709 秋季创意者更新导致Linux双系统无法引导

热门文章

  1. 网络工程师(中级)下午笔记大全
  2. MySQL-实践总结-
  3. 人生与工作——惠普前中国区总裁孙振耀的“退休HP九大感言”
  4. Human-level concept learning through probabilistic program induction学习与验证
  5. Vue 中调用 QQ官方的登录
  6. 【实时数仓】DWM层订单宽表之需求分析、订单和订单明细关联源码
  7. BOSS系统概念简介
  8. c语言循环打擂,【浩方对战平台和C语言编译器哪个好用】浩方对战平台和C语言编译器对比-ZOL下载...
  9. 武汉生物工程学院计算机专业怎么样,武汉生物工程学院就业率怎么样(含好就业的专业)...
  10. 前端link标签引入css教程