讨论 / 第20个测试点超时怎么解决
漓" 2018-08-08 18:51:57
点我顶贴 收藏 删除
代码如下:

#include<iostream>

#include<stdio.h>

using namespace std;

int a[15005],b[15005],c[15005],d[15005],w[15005],h[40005],n,m,x,y;

//abcd表示某个点作为abcd物品出现的次数;w表示数轴上每个点出现的次数;h表示每个物品的魔法值

//n表示最大魔法值,m表示物品数量

int main()

{

cin>>n>>m;

if(n<11)

{

for(int i=1;i<=m;i++) printf("0 0 0 0\n");

return 0;

}

for(int i=1;i<=m;i++)

{

scanf("%d",&h[i]);

w[h[i]]++;

}//把这些点标记在数轴上

for(int i=1;i<=n/9;i++)

{

//若数轴上有一个魔法阵:ABCD,其中有AB=2*CD,BC>6*CD

//所以只需枚举CD的长度就可以了

x=1+9*i,y=0;//x为AD最短长度

for(int j=2+9*i;j<=n;j++)

{

//因为数轴是从1开始的,所以从1+x开始枚举

//枚举D点即j,则C点为j-i,A点为j-x,B点为j-x+2*i

//CD的个数取决于AB有多少组,所以我们用y表示AB的组数

y+=w[j-x]*w[j-x+i+i];//y为AB的对数

//D点是不定的。但是D点变化时,之前合格的AB两点仍然合格,所以要累加

d[j]+=y*w[j-i];//有几组AB,就有几个C点,就有几个D点

c[j-i]+=y*w[j];//有几组AB,就有几个D点,就有几个C点

}

//注意,魔法值可能重复,所以在加的时候,注意不要直接加。

//同理,枚举CD两点,确定AB的个数

x=8*i+1,y=0;

for(int j=n-9*i-1;j>=1;j--)

{

y+=w[j+x]*w[j+x+i];

a[j]+=y*w[j+i+i];

b[j+i+i]+=y*w[j];

}

}

for(int i=1;i<=m;i++)//输出每个物品对应的魔法值的作为abcd物品的次数

cout<<a[h[i]]<<' '<<b[h[i]]<<' '<<c[h[i]]<<' '<<d[h[i]]<<endl;

}

#1 大神在此@2018-11-10 22:17:59
回复 删除
你可以把cin和cout改成scanf和printf
#2 大神在此@2018-11-10 22:18:15
回复 删除
试试
#3 a1b3c7d9@2018-11-14 21:55:01
回复 删除
i agree
查看更多回复
提交回复