洛谷 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个方格.每个方格内有一个小灯泡,灯泡的状态有两种(亮或暗).我们可以通过若干操作使魔板从一个状态改变为另一个状 ...
随机推荐
- SpringBoot整合Shiro使用Ehcache等缓存无效问题
前言 整合有缓存.事务的spring boot项目一切正常. 在该项目上整合shiro安全框架,发现部分类的缓存Cache不能正常使用. 然后发现该类的注解基本失效,包括事务Transaction注解 ...
- Python网络爬虫实战:根据天猫胸罩销售数据分析中国女性胸部大小分布
本文实现一个非常有趣的项目,这个项目是关于胸罩销售数据分析的.是网络爬虫和数据分析的综合应用项目.本项目会从天猫抓取胸罩销售数据,并将这些数据保存到SQLite数据库中,然后对数据进行清洗,最后通过S ...
- OSGI基础环境搭建
1.安装jdk,步骤自行搜索 2.下载eclipse,用luna版本,下载地址: https://pan.baidu.com/s/1gdfmW5znU4fltsLCAo8tkg 提取码: nrg7 3 ...
- 我的微信小程序第一篇(入门)
前言 微信小程序出来已经有一段时间了,已经有很多大牛都写过相关教程了,那么我为啥还要写这篇文章呢?其实仅仅是个人对微信开发的一个兴趣吧,觉得是个很有意思的事情,后面有时间可能会发更多关于小程序的文章, ...
- itoa函数实现
1. 整数字符转化为字符串数 // 将整数转换成字符串数,不用函数itoa // 思路:采用加'0',然后在逆序的方法 #include <iostream> using nam ...
- 把玩Alpine linux(二):APK包管理器
导读 Alpine Linux非常精简,开机内存占用也在二三十兆大,没有拆箱即用,就需要我们自己去做一些了解和配置 Alpine Linux的优劣 优势 Alpine Linux的Docker镜像特点 ...
- centos 7 network.service control process exited
一.service network restart 出错 问题描述: vmware 12 下centos 7 网络模式,NAT 昨晚作者打算更新自己虚拟机python,发现没网络ping www.ba ...
- docker开启加速(第三篇)
前言: docker的镜像仓库在国外,下载会很慢,启用阿里云加速. 第一步:cd /etc/docker目录下,打开daemon.json 第二步:修改daemon.json文件,添加阿里云加速: ...
- vue 项目使用 webpack 构建自动获取电脑ip地址
1.开发 H5 时移动端,经常会使用真机进行调试本地环境.webpack 配置服务器好多脚手架写的都是固定的,而在团队开发中需要每人配置自己的本机 ip 进行开发,每次开启开发环境的都需要修改,并且还 ...
- flutter中使用svg
dependencies: flutter_svg: ^0.12.1 flutter packages get import 'package:flutter_svg/flutter_svg.dart ...