今天模拟赛的题,,,唯一没有Giao出来的题(不然我就AKIOI了~)

最开始没想到数学题,把所有部分分都说一遍吧:

35分:纯暴力O(M^4)枚举,对于每一组a,b,c,d验证其是否合法。

60分:经过读题,不难发现a,b,c,d单调递增,可以考虑对其进行排序后再暴力枚举,枚举量减少近一半。

85分:对xb-xa=2(xd-xc)进行分析,可以得到以下公式:double((xb-xa+2xc)/2)=double(xd),再查找是否存在xd,这样我们只需枚举a,b,c,时间复杂度是O(M^3)

100分:依旧是对xb-xa=2(xd-xc)进行分析,我们设t=xd-xc,则xb-xa=2⋅t;再分析第二个条件Xb−Xa<(Xc−Xb)/3,我们可以得到Xc−Xb>6⋅t,我们给他补全成等号,就是Xc−Xb=6⋅t+k

所以这四个数在数轴上的排列如图所示(图片来自博客园

所以我们会有一个不成熟的思路:在1-n/9范围内枚举t,把a,b,c,d拿t表示出来。

那么如何计算呢?枚举D。当我们枚举到一个D值的时候,与之对应的C值是确定的(不受k影响),而A值和B值却不一定。因此我们可以找到最大的与之对应的A值B值。

但是有可能会存在一组AB值要比当前计算到的小,怎么办呢?不妨设有可能存在的比最大值小的A值为A1,B值为B1,计算到的为A2和B2

当A1<A2&&B1<B2时,只要A2和B2能组成魔法阵,A1和B1一定可以(k只是大于0的数,而对k的上界没有限制,当我们把k放大时,就可以构造出A1和B1了)。

由于是顺序枚举,所以我们可以记录一下之前有多少组合法解(类似于前缀和),最后再用乘法原理计算。同样的方法,我们从A的上界往A的下界枚举记录后缀和然后计算即可。

下面给出参考代码:

 // luogu-judger-enable-o2
#include<iostream>
#include<cstdio>
#include<cstring>
#define N 50005
#define M 50005
using namespace std;
int n,m,ans[M][],num[M],a[M],A,B,C,D;
int read()
{
int x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=;ch=getchar();}
while(ch>=''&&ch<=''){x=(x<<)+(x<<)+(ch^);ch=getchar();}
if(f)return x;return -x;
}
int main()
{
n=read();m=read();
for(int i=;i<=m;i++)
{
a[i]=read();
num[a[i]]++;
}
for(int t=;t*<n;t++)
{
int sum=;
for(D=*t+;D<=n;D++)
{
C=D-t;
B=C-*t-;
A=B-*t;
sum+=num[A]*num[B];
ans[C][]+=num[D]*sum;
ans[D][]+=num[C]*sum;
}
sum=A=B=C=D=;
for(A=n-t*-;A>=;A--)
{
B=A+*t;
C=B+*t+;
D=C+t;
sum+=num[C]*num[D];
ans[A][]+=num[B]*sum;
ans[B][]+=num[A]*sum;
}
}
for(int i=;i<=m;i++)
{
for(int j=;j<=;j++)
{
cout<<ans[a[i]][j]<<" ";
}
cout<<endl;
}
return ;
}

[NOIP2016PJ]魔法阵的更多相关文章

  1. 洛谷 P2119 魔法阵

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

  2. [luogu2119]魔法阵 NOIP2016T4

    很好的一道数学推导题 45分做法 $O(N^4)$暴力枚举四个材料 55分做法 从第一个约束条件可得到所有可行答案都是单调递增的,所以可以排序一遍,减少枚举量,可以拿到55分 100分做法 首先可以发 ...

  3. 【DFS】佳佳的魔法阵

    [vijos1284]佳佳的魔法阵 背景 也许是为了捕捉猎物(捕捉MM?),也许是因为其它原因,总之,佳佳准备设计一个魔法阵.而设计魔法阵涉及到的最关键问题,似乎就是那些带有魔力的宝石的摆放…… 描述 ...

  4. 洛谷P2119 魔法阵

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

  5. [NOIP2016普及组]魔法阵

    题目:洛谷P2119.Vijos P2012.codevs5624. 题目大意:有n件物品,每件物品有个魔法值.要求组成魔法阵(Xa,Xb,Xc,Xd),该魔法阵要满足Xa<Xb<Xc&l ...

  6. P2119 魔法阵

    原题链接  https://www.luogu.org/problemnew/show/P2119 YY同学今天上午给我们讲了这个题目,我觉得她的思路很好,特此写这篇博客整理一下. 50分:暴力枚举 ...

  7. 洛谷 题解 P2119【魔法阵】

    很好的一道数学推导题 45分做法 \(O(N^4)\) 暴力枚举四个材料 55分做法 从第一个约束条件可得到所有可行答案都是单调递增的,所以可以排序一遍,减少枚举量,可以拿到55分 100分做法 首先 ...

  8. 题解 【NOIP2016】魔法阵

    [NOIP2016]魔法阵 Description 六十年一次的魔法战争就要开始了,大魔法师准备从附近的魔法场中汲取魔法量. 大魔法师有m个魔法物品,编号分别为1,2,...,m.每个物品具有一个魔法 ...

  9. 「Vijos 1284」「OIBH杯NOIP2006第二次模拟赛」佳佳的魔法阵

    佳佳的魔法阵 背景 也许是为了捕捉猎物(捕捉MM?),也许是因为其它原因,总之,佳佳准备设计一个魔法阵.而设计魔法阵涉及到的最关键问题,似乎就是那些带有魔力的宝石的摆放-- 描述 魔法阵是一个\(n ...

随机推荐

  1. [HEOI2015]兔子与樱花(贪心)

    [HEOI2015]兔子与樱花 Description 很久很久之前,森林里住着一群兔子.有一天,兔子们突然决定要去看樱花.兔子们所在森林里的樱花树很特殊.樱花树由\(n\)个树枝分叉点组成,编号从\ ...

  2. (arm板子tensorflow安装)armv7板子pip安装的wheel

    树莓派之类的armv7板子在,安装 numpy,scipy时经常失败,因为安装过程是下载源码包到本地编译,然后再安装的,编译过程中往往就会失败. https://www.piwheels.org/si ...

  3. HashMap测试程序1

    package com.iotek.map; import java.util.Collection;import java.util.HashMap;import java.util.Map;imp ...

  4. dubbo-go 中的 TPS Limit 设计与实现

    前言 Apache Dubbo 是由阿里开源的一个RPC框架,除了基本的 RPC 功能以外,还提供了一整套的服务治理相关功能.目前它已经是 Apache 基金会下的顶级项目. 而 dubbo-go 则 ...

  5. python 全栈开发,Day9(函数的初始,返回值,传参,三元运算)

    一.函数的初始 比如python没有len()方法,如果求字符串的长度 使用for循环 s = 'asdfadsf' count = 0 for i in s: count += 1 print(co ...

  6. Arithmetic Sequence

    Arithmetic Sequence Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Othe ...

  7. Fiddler正则匹配调试接口示例

    Fiddler基础知识 Fiddler是强大的抓包工具,它的原理是以web代理服务器的形式进行工作的,使用的代理地址是:127.0.0.1,端口默认为8888,我们也可以通过设置进行修改. 代理就是在 ...

  8. OC端代码

    ViewController.m #import "ViewController.h"#import <Flutter/Flutter.h>#include " ...

  9. womenzijide_jiafenxiang

    <!DOCTYPE html> <html lang="en"> <head> <meta http-equiv="Conten ...

  10. SQL element_at函数

    库里有类似josn形式的字符串数据attr{"a":"123","b":"234"."c":&quo ...