题解 SP4580 【ABCDEF - ABCDEF】

xzyxzy

2018-07-14 08:48:08

Solution

枚举6个会TLE 所以Meet in the middle 枚举3个 ~~辣鸡~~用Map会TLE 还有注意d=0是不合法的 ```cpp #include<iostream> #include<cstdio> #include<cstdlib> #include<algorithm> #define ll long long using namespace std; const int N=1000100; int n,s[N],w[N],v[N],B[N],cnt; ll ans; int find(int x) { int l=1,r=cnt,res=0; while(l<=r) { int mid=(l+r)>>1; if(B[mid]>=x) r=mid-1,res=mid; else l=mid+1; } return B[res]==x?v[res]:0; } void Get(int op) { for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) for(int k=1;k<=n;k++) { if(op==1) w[++cnt]=s[i]*s[j]+s[k]; else if(s[k]!=0) ans+=find((s[i]+s[j])*s[k]); } if(op==1) { sort(w+1,w+cnt+1); int top=0; for(int i=1;i<=cnt;i++) if(w[i]==B[top]&&top) v[top]++; else B[++top]=w[i],v[top]=1; cnt=top; } } int main() { cin>>n; for(int i=1;i<=n;i++) cin>>s[i]; Get(1);Get(2); printf("%lld\n",ans); } ``` ~~广告:MITM以及搜索有关(舞蹈链、退火啥的)[https://www.cnblogs.com/xzyxzy/]~~