75分TLE求大神

P2119 [NOIP2016 普及组] 魔法阵

我考试的时候和你类似的想法,只不过用了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


|