洛谷 P2119 魔法阵

P2119 魔法阵

题目描述

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

大魔法师有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)/3时,这四个魔法物品形成了一个魔法阵,他称这四个魔法物品分别为这个魔法阵的A物品,B物品,C物品,D物品。

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

输入输出格式

输入格式:

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

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

保证1 \le n \le 150001≤n≤15000,1 \le m \le 400001≤m≤40000,1 \le Xi \le n1≤Xi≤n。每个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

说明

【样例解释1】

共有5个魔法阵,分别为:

物品1,3,7,6,其魔法值分别为1,7,26,29;

物品1,5,2,7,其魔法值分别为1,5,24,26;

物品1,5,7,4,其魔法值分别为1,5,26,28;

物品1,5,8,7,其魔法值分别为1,5,24,26;

物品5,3,4,6,其魔法值分别为5,7,28,29。

以物品5为例,它作为A物品出现了1次,作为B物品出现了3次,没有作为C物品或者D物品出现,所以这一行输出的四个数依次为1,3,0,0。

此外,如果我们将输出看作一个m行4列的矩阵,那么每一列上的m个数之和都应等于魔法阵的总数。所以,如果你的输出不满足这个性质,那么这个输出一定不正确。你可以通过这个性质在一定程度上检查你的输出的正确性。

【数据规模】

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define MAXN 40010
using namespace std;
int n,m;
int x[MAXN],a[MAXN],b[MAXN],c[MAXN],d[MAXN];
bool judge(int i,int j,int k,int l){
    if(x[i]<x[j]&&x[j]<x[k]&&x[k]<x[l]&&x[j]-x[i]==2*(x[l]-x[k])&&double(x[j]-x[i])<double(x[k]-x[j])/3.0){
        a[i]++;b[j]++;
        c[k]++;d[l]++;
    }
}
int main(){
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;i++)    scanf("%d",&x[i]);
    for(int i=1;i<=m;i++)
        for(int j=1;j<=m;j++)
            for(int k=1;k<=m;k++)
                for(int l=1;l<=m;l++)
                    judge(i,j,k,l);
    for(int i=1;i<=m;i++)
        cout<<a[i]<<" "<<b[i]<<" "<<c[i]<<" "<<d[i]<<endl;
} 

m^4的暴力,只有35分

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define MAXN 40010
using namespace std;
int n,m,tot;
int num[MAXN],sum[MAXN];
int x[MAXN],a[MAXN],b[MAXN],c[MAXN],d[MAXN];
bool judge(int i,int j,int k,int l){
    if(x[i]<x[j]&&x[j]<x[k]&&x[k]<x[l]&&x[j]-x[i]==2*(x[l]-x[k])&&double(x[j]-x[i])<double(x[k]-x[j])/3.0){
        a[i]++;b[j]++;
        c[k]++;d[l]++;
    }
}
int main(){
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;i++){
        scanf("%d",&x[i]);
        sum[x[i]]++;
    }
    for(int i=1;i<=15000;i++)
        if(sum[i])    num[++tot]=i;
    for(int i=1;i<=tot;i++)
        for(int j=i+1;j<=tot;j++)
            for(int k=j+1;k<=tot;k++){
                if(4*num[j]-3*num[i]-num[k]>=0)    continue;
                for(int l=k+1;l<=tot;l++)
                    if(num[j]-num[i]==2*(num[l]-num[k])){
                        a[num[i]]+=sum[num[j]]*sum[num[k]]*sum[num[l]];
                        b[num[j]]+=sum[num[i]]*sum[num[k]]*sum[num[l]];
                        c[num[k]]+=sum[num[i]]*sum[num[j]]*sum[num[l]];
                        d[num[l]]+=sum[num[i]]*sum[num[j]]*sum[num[k]];
                    }
            }
    for(int i=1;i<=m;i++)
        cout<<a[x[i]]<<" "<<b[x[i]]<<" "<<c[x[i]]<<" "<<d[x[i]]<<endl;
}
/*
30 8
1
24
7
28
5
29
26
24
*/

70分的暴力

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int a[40050];
int ans[15050][10];
int t[15050];
int main() {
    int n,m;
    cin>>n>>m;
    for(int i=1;i<=m;i++){
        cin>>a[i];
        t[a[i]]++;
    }
    for(int i=1;i<=(n-2)/9;i++){
        int sum=0,x=9*i+1;
        for(int xd=9*i+2;xd<=n;xd++){
            int xc=xd-i;
            sum+=t[xd-x]*t[xd-x+2*i];
            ans[xd][4]+=sum*t[xc];
            ans[xc][3]+=sum*t[xd];
        }
        sum=0;
        x=n-9*i-1;
        for(int xa=n-9*i-1;xa>=1;xa--){
            int xb=xa+2*i;
            sum+=t[n-(x-xa)]*t[n-(x-xa)-i];
            ans[xa][1]+=sum*t[xb];
            ans[xb][2]+=sum*t[xa];
        }
    }
    for(int i=1;i<=m;i++){
        for(int j=1;j<=4;j++){
            cout<<ans[a[i]][j]<<" ";
        }
        cout<<endl;
    }
    return 0;
}

数学推论 AC

时间: 2024-08-25 08:36:48

洛谷 P2119 魔法阵的相关文章

洛谷P2119 魔法阵

题目描述 六十年一次的魔法战争就要开始了,大魔法师准备从附近的魔法场中汲取魔法能量. 大魔法师有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)/3时,这四个魔法物品形成了一个魔法阵,他称这四个魔法物品分别为这个魔法阵的

洛谷 P1275 魔板

P1275 魔板 题目描述 有这样一种魔板:它是一个长方形的面板,被划分成n行m列的n*m个方格.每个方格内有一个小灯泡,灯泡的状态有两种(亮或暗).我们可以通过若干操作使魔板从一个状态改变为另一个状态.操作的方式有两种: (1)任选一行,改变该行中所有灯泡的状态,即亮的变暗.暗的变亮: (2)任选两列,交换其位置. 当然并不是任意的两种状态都可以通过若干操作来实现互相转化的. 你的任务就是根据给定两个魔板状态,判断两个状态能否互相转化. 输入输出格式 输入格式: 文件中包含多组数据.第一行一个

洛谷 P2730 魔板 Magic Squares

P2730 魔板 Magic Squares 题目背景 在成功地发明了魔方之后,鲁比克先生发明了它的二维版本,称作魔板.这是一张有8个大小相同的格子的魔板: 1 2 3 4 8 7 6 5 题目描述 我们知道魔板的每一个方格都有一种颜色.这8种颜色用前8个正整数来表示.可以用颜色的序列来表示一种魔板状态,规定从魔板的左上角开始,沿顺时针方向依次取出整数,构成一个颜色序列.对于上图的魔板状态,我们用序列(1,2,3,4,5,6,7,8)来表示.这是基本状态. 这里提供三种基本操作,分别用大写字母“

洛谷P2730 魔板 Magic Squares

P2730 魔板 Magic Squares 题目背景 在成功地发明了魔方之后,鲁比克先生发明了它的二维版本,称作魔板.这是一张有8个大小相同的格子的魔板: 1 2 3 4 8 7 6 5 题目描述 我们知道魔板的每一个方格都有一种颜色.这8种颜色用前8个正整数来表示.可以用颜色的序列来表示一种魔板状态,规定从魔板的左上角开始,沿顺时针方向依次取出整数,构成一个颜色序列.对于上图的魔板状态,我们用序列(1,2,3,4,5,6,7,8)来表示.这是基本状态. 这里提供三种基本操作,分别用大写字母“

[NOIP2016普及组]魔法阵

题目:洛谷P2119.Vijos P2012.codevs5624. 题目大意:有n件物品,每件物品有个魔法值.要求组成魔法阵(Xa,Xb,Xc,Xd),该魔法阵要满足Xa<Xb<Xc<Xd,Xb-Xa=2(Xd-Xc),并且Xb-Xa<(Xc-Xb)/3.求每件物品作为a.b.c.d的次数. 解题思路:这真是一道锻炼思(bào)维(lì)能力的好(kēng)题! 首先枚举魔法阵的每件物品,姿势好可得65(洛谷测). 然后是强(wěi)大(suǒ)的正解. 首先利用桶排的思路保存各

洛谷 P3375 【模板】KMP字符串匹配 || HDU 1686 Oulipo || kmp

HDU-1686 P3375 kmp介绍: http://www.cnblogs.com/SYCstudio/p/7194315.html http://blog.chinaunix.net/uid-8735300-id-2017161.html(mp&kmp) http://www-igm.univ-mlv.fr/~lecroq/string/node8.html(mp&kmp,看上去很正确的例程) http://blog.csdn.net/joylnwang/article/detai

洛谷 P2709 BZOJ 3781 小B的询问

题目描述 小B有一个序列,包含N个1~K之间的整数.他一共有M个询问,每个询问给定一个区间[L..R],求Sigma(c(i)^2)的值,其中i的值从1到K,其中c(i)表示数字i在[L..R]中的重复次数.小B请你帮助他回答询问. 输入输出格式 输入格式: 第一行,三个整数N.M.K. 第二行,N个整数,表示小B的序列. 接下来的M行,每行两个整数L.R. 输出格式: M行,每行一个整数,其中第i行的整数表示第i个询问的答案. 输入输出样例 输入样例#1: 6 4 3 1 3 2 1 1 3

洛谷1231 教辅的组成

洛谷1231 教辅的组成 https://www.luogu.org/problem/show?pid=1231 题目背景 滚粗了的HansBug在收拾旧语文书,然而他发现了什么奇妙的东西. 题目描述 蒟蒻HansBug在一本语文书里面发现了一本答案,然而他却明明记得这书应该还包含一份练习题.然而出现在他眼前的书多得数不胜数,其中有书,有答案,有练习册.已知一个完整的书册均应该包含且仅包含一本书.一本练习册和一份答案,然而现在全都乱做了一团.许多书上面的字迹都已经模糊了,然而HansBug还是可

洛谷教主花园dp

洛谷-教主的花园-动态规划 题目描述 教主有着一个环形的花园,他想在花园周围均匀地种上n棵树,但是教主花园的土壤很特别,每个位置适合种的树都不一样,一些树可能会因为不适合这个位置的土壤而损失观赏价值. 教主最喜欢3种树,这3种树的高度分别为10,20,30.教主希望这一圈树种得有层次感,所以任何一个位置的树要比它相邻的两棵树的高度都高或者都低,并且在此条件下,教主想要你设计出一套方案,使得观赏价值之和最高. 输入输出格式 输入格式: 输入文件garden.in的第1行为一个正整数n,表示需要种的