我考试的时候和你类似的想法,只不过用了vector数组,75分,现在真是悔恨万千!只需要记下来每个值的答案,最后输出ans[x[i]],就是85分了。
```cpp
#include<cstdio>
#define max(a,b) ((a)>(b)?(a):(b))
char rBuf[1<<25],pBuf[1<<25];
char *rbuf=rBuf,*pbuf=pBuf;
int getint()
{
int x=0;
while(*rbuf<'0'||*rbuf>'9')rbuf++;
while(*rbuf>='0'&&*rbuf<='9')x=x*10+(*rbuf++-'0');
return x;
}
void putint(int x)
{
if(x>9)putint(x/10);
*pbuf++=x%10+'0';
}
const int N=15005,M=40005;
int n,m,x[M],ans[N][4],s[N];
void output()
{
for(int i=1;i<=m;i++)
{
for(int j=0;j<4;j++)
{
putint(ans[x[i]][j]);
*pbuf++=' ';
}
*pbuf++='\n';
}
fwrite(pBuf,pbuf-pBuf,1,stdout);
}
int main()
{
fread(rBuf,1,1<<25,stdin);
n=getint();m=getint();
for(int i=1;i<=m;i++)
s[x[i]=getint()]++;
for(int a=1;a<=n;a++)
if(s[a])
for(int b=a+1;b<=n;b++)
if(s[b])
for(int c=max(b+1,4*b-3*a+1);c<=n;c++)
if(s[c])
{
if(((b-a+2*c)&1)==0)
{
int d=(b-a+2*c)>>1;
if(d>c&&d<=n&&s[d])
{
ans[a][0]+=s[b]*s[c]*s[d];
ans[b][1]+=s[a]*s[c]*s[d];
ans[c][2]+=s[a]*s[b]*s[d];
ans[d][3]+=s[a]*s[b]*s[c];
}
}
}
output();
return 0;
}
```
by rushcheyo @ 2016-11-21 12:17:28