洛谷 题解 P2119【魔法阵】
很好的一道数学推导题
45分做法
\(O(N^4)\)
暴力枚举四个材料
55分做法
从第一个约束条件可得到所有可行答案都是单调递增的,所以可以排序一遍,减少枚举量,可以拿到55分
100分做法
首先可以发现每个x都小于n,而n最大值只是15000,所以可以开一个桶来存每个魔法值出现的次数
回忆一下3个约束条件
\(xa<xb<xc<xd\)①
\(xb-xa=2(xd-xc)\)②
\(xb-xa<(xc-xb)/3\)③
现在魔改一下这三个式子
设\(t=xd-xc\)
所以②可化为\(xb-xa=2t\)④
将④代入③
\(2t<(xc-xb)/3\)
移项一下,就变成
\(6t<xc-xb\)⑤
再魔改一下
设\(6t+k=xc-xb\)(就是把差的部分补上去)
于是可以画出来一个图
显然,A的最小值为1,D的最大值为n
由图可得\(AD=9t+k\)
所以我们可以尝试着枚举t,用t来表示各个魔法值的值
由上易得t的范围为\(1<=t<=(n-1)/9\)
再枚举D,因为我们已经枚举出了t,所以C的值是可以直接算出来的
\(C=D-t\)
又因为使A,B,C,D满足条件的k的最小值为1,所以对于当前的C和D,最大的A和B为\(A=D-9t-1\),\(B=D-7t-1\)
那么如果A和B更小怎么办?
观察到在其他条件不变的情况下,只要CC和BB满足\(Xc-Xb>6t\),那么这个魔法阵就一定成立,所以当\((a1<a2,b1<b2)\)时,只要a2和b2能够和C,D组成魔法阵,a1,b1也一定能和C,D组成魔法阵,所以可以使用前缀和优化
然后又由乘法原理可得,当前魔法值作为DD物品的个数为\(SumD=SumA*SumB*SumC\)
所以我们利用前缀和优化\(SumA*SumB\)
C的情况可以顺便在算D的时候算出来
那么还有一个问题是,我们枚举的D的范围是多少?
因为要统计前缀和,所以一定是要顺推下去的,由上面那张图我们可以知道,D的最大值为n,最小值则为当k=1且A=1的时候,所以D的最小值为\(9*t+2\),再小是无法组成魔法阵的
同理可以枚举A
但是这个的情况又和枚举D的情况有一点不同
在其他条件不变的情况下,只要C和B满足\(Xc−Xb>6t\),那么这个魔法阵就一定成立,所以当\((c1<c2,d1<d2)\)时,只要c1和d1能够和A,B组成魔法阵,c2,d2也一定能和A,B组成魔法阵,所以可以使用后缀和优化
因为需要统计后缀和,所以需要逆推
枚举的范围:A的最大值为\((n−t∗9−1)\)(因为当k=1,D=n的时候A才最大),A的最小值则为1
所以就可以算出每个魔法值作为A,B,C,D物品的次数了,输出时直接输出当前魔法物品的魔法值的次数就可以了
代码:
#include<bits/stdc++.h>
using namespace std;
const int MAXN=15000+10;
const int MAXM=40000+10;
int n,m;
int x[MAXM],v[MAXN];
int a[MAXN],b[MAXN],c[MAXN],d[MAXN];
inline int read()
{
int tot=0;
char c=getchar();
while(c<'0'||c>'9')
c=getchar();
while(c>='0'&&c<='9')
{
tot=tot*10+c-'0';
c=getchar();
}
return tot;
}
int main()
{
n=read();m=read();
for(int i=1;i<=m;i++)
{
x[i]=read();
v[x[i]]++;
}
for(int t=1;t<=(n-1)/9;t++)
{
int sum=0;
for(int D=9*t+2;D<=n;D++)
{
int A=D-9*t-1,B=D-7*t-1,C=D-t;
sum+=v[A]*v[B];
c[C]+=v[D]*sum;
d[D]+=v[C]*sum;
}
sum=0;
for(int A=n-9*t-1;A>=1;A--)
{
int B=A+2*t,C=8*t+1+A,D=9*t+1+A;
sum+=v[C]*v[D];
a[A]+=v[B]*sum;
b[B]+=v[A]*sum;
}
}
for(int i=1;i<=m;i++)
cout<<a[x[i]]<<" "<<b[x[i]]<<" "<<c[x[i]]<<" "<<d[x[i]]<<endl;
return 0;
}
洛谷 题解 P2119【魔法阵】的更多相关文章
- 洛谷P2119 魔法阵
P2119 魔法阵 题目描述 六十年一次的魔法战争就要开始了,大魔法师准备从附近的魔法场中汲取魔法能量. 大魔法师有m个魔法物品,编号分别为1,2,...,m.每个物品具有一个魔法值,我们用Xi表示编 ...
- 洛谷 P2119 魔法阵
题目描述 六十年一次的魔法战争就要开始了,大魔法师准备从附近的魔法场中汲取魔法能量. 大魔法师有mm个魔法物品,编号分别为1,2,...,m1,2,...,m.每个物品具有一个魔法值,我们用X_iXi ...
- 洛谷P4891 序列 || 膜法阵,魔法阵
https://www.luogu.org/problemnew/show/P4891 一道几乎一样的题http://210.33.19.103/contest/1130/problem/3 题面ht ...
- 洛谷 题解 UVA572 【油田 Oil Deposits】
这是我在洛谷上的第一篇题解!!!!!!!! 这个其实很简单的 我是一只卡在了结束条件这里所以一直听取WA声一片,详细解释代码里见 #include<iostream> #include&l ...
- P2119 魔法阵
原题链接 https://www.luogu.org/problemnew/show/P2119 YY同学今天上午给我们讲了这个题目,我觉得她的思路很好,特此写这篇博客整理一下. 50分:暴力枚举 ...
- 洛谷 题解 P1600 【天天爱跑步】 (NOIP2016)
必须得说,这是一道难题(尤其对于我这样普及组205分的蒟蒻) 提交结果(NOIP2016 天天爱跑步): OJ名 编号 题目 状态 分数 总时间 内存 代码 / 答案文件 提交者 提交时间 Libre ...
- 洛谷题解P4314CPU监控--线段树
题目链接 https://www.luogu.org/problemnew/show/P4314 https://www.lydsy.com/JudgeOnline/problem.php?id=30 ...
- 题解【洛谷P2730】魔板 Magic Squares
题面 首先我们可以发现,在每一次 BFS 时按照 \(A→B→C\) 的顺序枚举遍历肯定是字典序最小的. 然后就是普通的 BFS 了. 我们考虑使用 \(\text{STL map}\) 来存储起点状 ...
- 洛谷题解 CF777A 【Shell Game】
同步题解 题目翻译(可能有童鞋没读懂题面上的翻译) 给你三张牌0,1,2. 最初选一张,然后依次进行n次交换,交换规则为:中间一张和左边的一张,中间一张和右边一张,中间一张和左边一张...... 最后 ...
随机推荐
- Node.js 调试小技巧
小技巧--使用 supervisor如果你有 PHP 开发经验,会习惯在修改 PHP 脚本后直接刷新浏览器以观察结果,而你在开发 Node.js 实现的 HTTP 应用时会发现,无论你修改了代码的哪一 ...
- flutter布局-1-column
1.mainAxisAlignment:主轴布局方式,column主轴方向是垂直的方向 mainaxis.png 默认值:MainAxisAlignment.start: start ,沿着主轴方 ...
- 基础数据类型-字符串str
什么是字符串? 单引号,双引号,三引号包裹的文本 在我们的代码中换行区别 单/双引号:‘a’\ 'b' 三引号:"""a b""" 索引 s ...
- 关于VGA显示实验的问题
今天做了一个关于VGA的显示实验,但是由于产生的25M时钟不正确所以一直没有图像产生.刚开始的程序如下 虽然仿真的时候出现了时序,但是在下载到硬件的时候不正确. 后来改成 结果就正确了. 另外之前关于 ...
- CF1153E Serval and Snake【构造】
题目链接:洛谷 这道题是很久以前NTF跟我说的,现在想起来把它做了... 我们发现,如果蛇的两头都在矩形里或矩形外,则询问为偶数,否则为奇数. 所以我们询问每一行和每一列,就能知道蛇的两头的横纵坐标了 ...
- JVM——垃圾回收
目录: 如何判断垃圾是否回收? 引用计数法 可达性分析算法 四种引用 引用队列 垃圾回收算法 标记清除算法 复制算法 标记整理算法 分代垃圾回收 新生代 老年代 Minor GC 和 Full GC的 ...
- rtp发送 h265
自己写的select 做TCP服务端,把tcp数据按照RTSP协议解析,掉函数直接获取一帧音频,一帧视频这种,分包成RTP发送 用ffmpeg
- tomcat发布web项目
转:https://www.cnblogs.com/skyblue-li/p/7888951.html Tomcat是一种Web服务器,我们自己做好了一个Web项目,就可以通过Tomcat来发布.服务 ...
- form表单无刷新提交
Ajax最大的特点就是可以不刷新页面而实现数据的通信及更改页面信息.那么用AJAX进行后台通信传递字符串还是可以的,遇到上传文件该怎么办呢?基于安全考虑,JS是不能直接进行文件操作的,只好用原始的fr ...
- 检测系统中进程占满单个cpu的情况
#!/bin/bash function thread_used_cpu(){ # $1 为单个cpu负载的百分比 if [[ $1 == "" ]];then full_load ...