只求穷举的55分

P2119 [NOIP2016 普及组] 魔法阵

我也是!这道题愣是做了一个小时没做出来郁闷死了
by sun坠坠 @ 2016-11-20 20:52:45


abcd应该都从1开始枚举……我差点就犯了这个错误……
by x_faraway_x @ 2016-11-20 21:24:03


同感,写得几乎一样
by Tritium @ 2016-11-20 22:22:51


啧为什么要这么枚举 可以发现4个数可以表示为 Xa,Xa+2k,Xa+8k+N,Xa+9k+n 枚举Xa,k,n就好了呀w 虽然只是80分做法没卵用 ```cpp #include<cstdio> #include<cstring> #include<cctype> #define rep(a,b,c) for(int a=b;a<=c;a++) using namespace std; int form[40020],sort[15020],ans[40020][5],n,m,t,maxn; inline int max(int a,int b){return a>b?a:b;} inline int getint() { char ch; while (!isdigit(ch=getchar())); int x=ch-'0'; for (; isdigit(ch=getchar()); x=x*10+ch-'0'); return x; } int main() { n=getint();m=getint(); rep(a,1,m) form[a]=getint(),sort[form[a]]++,maxn=max(maxn,form[a]); rep(a,1,maxn) if(sort[a]) rep(b,1,(maxn-a)/9) if(sort[a+2*b]) rep(c,1,maxn-9*b-a) if(sort[a+8*b+c]&&sort[a+9*b+c]) { int add=sort[a]*sort[a+2*b]*sort[a+8*b+c]*sort[a+9*b+c]; ans[a][1]+=add/sort[a],ans[a+2*b][2]+=add/sort[a+2*b],ans[a+8*b+c][3]+=add/sort[a+8*b+c],ans[a+9*b+c][4]+=add/sort[a+9*b+c]; } rep(a,1,m) printf("%d %d %d %d\n",ans[form[a]][1],ans[form[a]][2],ans[form[a]][3],ans[form[a]][4]); } 然而我还是不会写正解qwq ```
by fcoaxt @ 2016-11-21 00:13:27


懂了,快排出来有可能两个数等于。。。。好吧@[x咫尺天涯x](/space/show?uid=9757)
by Sylar @ 2016-11-21 17:54:09


六十分TLE ```cpp var c:array[1..40000,1..4]of longint; b,d:array[1..40000]of longint; n,m,i,j,k,l:longint; procedure js(l,r:longint); var i,j,m,t:longint; begin i:=l;j:=r;;m:=b[l+1]; repeat while b[i]<m do inc(i); while b[j]>m do dec(j); if i<=j then begin t:=b[i];b[i]:=b[j];b[j]:=t; t:=d[i];d[i]:=d[j];d[j]:=t; inc(i);dec(j); end; until i>j; if l<j then js(l,j); if i<r then js(i,r); end; begin read(n,m); for i:=1 to m do begin read(b[i]);d[i]:=i;end; js(1,m); for i:=1 to m-3 do for j:=i+1 to m-2 do if(b[i]<b[j])and((b[j]-b[i])mod 2=0)then for k:=j+1 to m-1 do if(b[j]<b[k])and(b[k]>b[j]-b[i])and(b[j]-b[i]<(b[k]-b[j])/3)then for l:=k+1 to m do if(b[k]<b[l])and(b[j]-b[i]=2*(b[l]-b[k]))then begin inc(c[d[i],1]); inc(c[d[j],2]); inc(c[d[k],3]); inc(c[d[l],4]); end; for i:=1 to m do begin for j:=1 to 4 do write(c[i,j],' '); writeln; end; end. ```
by liuyuli @ 2016-11-21 20:12:41


|