洛谷 P2119 魔法阵
题目描述
六十年一次的魔法战争就要开始了,大魔法师准备从附近的魔法场中汲取魔法能量。
大魔法师有mm个魔法物品,编号分别为1,2,...,m1,2,...,m。每个物品具有一个魔法值,我们用X_iXi表示编号为i的物品的魔法值。每个魔法值Xi是不超过n的正整数,可能有多个物品的魔法值相同。
大魔法师认为,当且仅当四个编号为a,b,c,da,b,c,d的魔法物品满足x_a<x_b<x_c<x_d,X_b-X_a=2(X_d-X_c)xa<xb<xc<xd,Xb−Xa=2(Xd−Xc),并且x_b-x_a<(x_c-x_b)/3xb−xa<(xc−xb)/3时,这四个魔法物品形成了一个魔法阵,他称这四个魔法物品分别为这个魔法阵的AA物品,BB物品,CC物品,DD物品。
现在,大魔法师想要知道,对于每个魔法物品,作为某个魔法阵的AA物品出现的次数,作为BB物品的次数,作为CC物品的次数,和作为DD物品的次数。
输入输出格式
输入格式:
第一行包含两个空格隔开的正整数n,mn,m。
接下来mm行,每行一个正整数,第i+1i+1行的正整数表示X_iXi,即编号为ii的物品的魔法值。
保证1 \le n \le 150001≤n≤15000,1 \le m \le 400001≤m≤40000,1 \le Xi \le n1≤Xi≤n。每个X_iXi是分别在合法范围内等概率随机生成的。
输出格式:
共mm行,每行44个整数。第ii行的44个整数依次表示编号为ii的物品作 为A,B,C,DA,B,C,D物品分别出现的次数。
保证标准输出中的每个数都不会超过10^9109。每行相邻的两个数之间用恰好一个空格隔开。
输入输出样例
30 8
1
24
7
28
5
29
26
24
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
15 15
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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】
共有55个魔法阵,分别为:
物品1,3,7,61,3,7,6,其魔法值分别为1,7,26,291,7,26,29;
物品1,5,2,71,5,2,7,其魔法值分别为1,5,24,261,5,24,26;
物品1,5,7,41,5,7,4,其魔法值分别为1,5,26,281,5,26,28;
物品1,5,8,71,5,8,7,其魔法值分别为1,5,24,261,5,24,26;
物品5,3,4,65,3,4,6,其魔法值分别为5,7,28,295,7,28,29。
以物品55为例,它作为AA物品出现了11次,作为BB物品出现了33次,没有作为CC物品或者DD物品出现,所以这一行输出的四个数依次为1,3,0,01,3,0,0。
此外,如果我们将输出看作一个mm行44列的矩阵,那么每一列上的mm个数之和都应等于魔法阵的总数。所以,如果你的输出不满足这个性质,那么这个输出一定不正确。你可以通过这个性质在一定程度上检查你的输出的正确性。
【数据规模】
首先吐槽一下,本来是考试前准备放松心情的,可最后的那个优化还是没有想到,心态爆炸,难受
第一个思路肯定就是m^4的纯模拟算法,可以拿到60分。
之后看到想法1根本没有用到题目中给定的n,n比m小,而且如果两个物品的魔法值相等,那么他们可以作为的魔法阵的情况也一定是一样的,可以考虑搞一个桶,题给条件中是有一个等式的,所以只需要枚举a,b,c,优化到n^3
仍然是TLE的,大概可以通过的算法是n^2,还需要再去掉一重,只能是前缀和优化了(反正我是没有想到23333)
分析一下全部的条件
a<b<c<d
b-a=2*(d-c)
3*(b-a)<c-b
整理一下,令d-c=t,则可以得到
b-a=2*t
b-c>6*t
如果枚举t的值,再枚举d的值,还需要枚举出全部的a,b,但是这时就可以考虑前缀和优化了,因为只要对于较小的c,d满足的a,b一定对于较大的c,d满足,所以可以再去掉一重循环。
#include<algorithm>
#include<iostream>
#include<cstdio>
using namespace std;
int n,m,res[][],a[],t[];
int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=m;i++)
{
scanf("%d",&a[i]);
t[a[i]]++;
}
for(int i=;*i<=n;i++)
{
int sum=,va,vb,vc,vd;
for(vd=*i+;vd<=n;vd++)
{
va=vd-*i-;
vb=va+*i;
vc=vd-i;
sum+=t[va]*t[vb];
res[][vc]+=sum*t[vd];
res[][vd]+=sum*t[vc];
}
sum=;
for(va=n-*i-;va>=;va--)
{
vb=va+*i;
vc=vb+*i+;
vd=vc+i;
sum+=t[vc]*t[vd];
res[][va]+=sum*t[vb];
res[][vb]+=sum*t[va];
}
}
for(int i=;i<=m;i++)
printf("%d %d %d %d\n",res[][a[i]],res[][a[i]],res[][a[i]],res[][a[i]]);
return ;
}
洛谷 P2119 魔法阵的更多相关文章
- 洛谷P2119 魔法阵
P2119 魔法阵 题目描述 六十年一次的魔法战争就要开始了,大魔法师准备从附近的魔法场中汲取魔法能量. 大魔法师有m个魔法物品,编号分别为1,2,...,m.每个物品具有一个魔法值,我们用Xi表示编 ...
- 洛谷P1585 魔法阵
题目传送门 这题就是一个有技巧的DFS+一大堆乱七八糟的剪枝 进行DFS时注意一下以下点 根据题意,我们可以把DFS分成两块,即1--n*m/2与n*m/2--n*m,第一块边找边记录,第二块就开始计 ...
- [洛谷P2730] 魔板 Magic Squares
洛谷题目链接:魔板 题目背景 在成功地发明了魔方之后,鲁比克先生发明了它的二维版本,称作魔板.这是一张有8个大小相同的格子的魔板: 1 2 3 4 8 7 6 5 题目描述 我们知道魔板的每一个方格都 ...
- P2119 魔法阵
原题链接 https://www.luogu.org/problemnew/show/P2119 YY同学今天上午给我们讲了这个题目,我觉得她的思路很好,特此写这篇博客整理一下. 50分:暴力枚举 ...
- 洛谷P2730 魔板 [广搜,字符串,STL]
题目传送门 魔板 题目背景 在成功地发明了魔方之后,鲁比克先生发明了它的二维版本,称作魔板.这是一张有8个大小相同的格子的魔板: 1 2 3 4 8 7 6 5 题目描述 我们知道魔板的每一个方格都有 ...
- 洛谷 P2730 魔板 Magic Squares 解题报告
P2730 魔板 Magic Squares 题目背景 在成功地发明了魔方之后,鲁比克先生发明了它的二维版本,称作魔板.这是一张有8个大小相同的格子的魔板: 1 2 3 4 8 7 6 5 题目描述 ...
- 洛谷P1275 魔板
P1275 魔板 题目描述 有这样一种魔板:它是一个长方形的面板,被划分成n行m列的n*m个方格.每个方格内有一个小灯泡,灯泡的状态有两种(亮或暗).我们可以通过若干操作使魔板从一个状态改变为另一个状 ...
- 洛谷 P2730 魔板 Magic Squares
P2730 魔板 Magic Squares 题目背景 在成功地发明了魔方之后,鲁比克先生发明了它的二维版本,称作魔板.这是一张有8个大小相同的格子的魔板: 1 2 3 4 8 7 6 5 题目描述 ...
- 洛谷 P1275 魔板
P1275 魔板 题目描述 有这样一种魔板:它是一个长方形的面板,被划分成n行m列的n*m个方格.每个方格内有一个小灯泡,灯泡的状态有两种(亮或暗).我们可以通过若干操作使魔板从一个状态改变为另一个状 ...
随机推荐
- Python股票分析系列——获得标普500的所有公司股票数据.p6
该系列视频已经搬运至bilibili: 点击查看 欢迎来到Python for Finance教程系列的第6部分. 在之前的Python教程中,我们介绍了如何获取我们感兴趣的公司名单(在我们的案例中是 ...
- bootstrapValidator表单验证插件
bootstrapValidator——一个很好用的表单验证插件,再也不用手写验证规则啦! bootstrapValidator官方文档:http://bootstrapvalidator.votin ...
- 计算机名称改名之后,tfs连接问题
计算机名称改名之后,我们发现tfs连接会有问题 打开vs下的“开发人员命令提示”执行下面两条语句: 1.tf workspaces 2.tf workspaces /collection:http:/ ...
- 小P的秘籍
题目描述 小P马上就要来到程序设计大赛的现场.上了,他希望能够AK这次比赛,所以他找到了一个字符串. 这个字符串长度为n,由A和K组成.这个字符串被小p称为AK串.小P任意截取一个区间s,使得这个区间 ...
- 1003: [ZJOI2006]物流运输 = DP+SBFA
题意就是告诉你有n个点,e条边,m天,每天都会从起点到终点走一次最短路,但是有些点在某些时间段是不可走的,因此在某些天需要改变路径,每次改变路径的成本是K,总成本=n天运输路线长度之和+K*改变运输路 ...
- centos7 安装phpmyadmin
1.先安装epel,不然安装pgpmyadmin时会出现找不到包. yum install epel-release rpm -ivh http://rpms.famillecollet.com/en ...
- Nagios 系统监控
Nagios 系统监控 Nagios 是一款免费的开源 IT 基础设施监控系统,功能强大,灵活性强,能有效监控 Windows.Linux.VMware 和 Unix 主机状态,交换机.路由器等网络设 ...
- jmeter操作数据库
1) jmeter不能直接连数据库,需要先添加jar包. 然后将jar包的路径添加到下图: 2) 操作数据库之前要知道数据库的信息(ip.端口号.账号.密码),操作哪个数据库就连哪个: ...
- 【问题解决方案】之 hadoop 用jps命令后缺少namenode的问题
用Xshell连接腾讯cloud里的虚拟机后,jps命令查无namenode导致过滤排序程序跑不起来,如图: 解决方案: Google之,说需要重启,格式化后再启动Hadoop.但鉴于本人不知道实现的 ...
- 面向对象设计的SOLID原则、迪米特法则
SPR(The Single Responsibility Principle):单一责任原则 OCP(The Open Closed Principle):开放封闭原则 LSP(The Liskov ...