1. 程式人生 > >jzoj3508-好元素【hash,優雅的暴力】

jzoj3508-好元素【hash,優雅的暴力】

正題

大意

一個序列A,求滿足

An+Am+Ap=Ai(n,m,p<i)
這個要求的Ai的個數

解題思路

我們先移一個項

An+Am=AiAp
然後用hash表儲存An+Am的所有答案,然後到達一個數的時候列舉p就可以O(n2)求出答案
玄學的是map庫只有40,這個故事告訴我們不要偷懶

程式碼

#include<cstdio>
#include<algorithm>
#define maxn 25000004
using namespace std
; int n,s,hash[maxn+10],a[5001]; bool v[maxn+10]; int hashmath(int x) {return (x%maxn+maxn)%maxn;} int locate(int x)//查詢位置 { int i=0,w=hashmath(x); while (i<maxn&&v[(w+i)%maxn]&&hash[(w+i)%maxn]!=x) i++; return (w+i)%maxn; } void ins(int x)//插入 { int w=locate(x); hash[w]=x;v[w]=true
; } bool find(int x)//查詢 { int w=locate(x); if (hash[w]==x&&v[w]) return true; else return false; } int main() { //freopen("good.in","r",stdin); //freopen("good.out","w",stdout); scanf("%d",&n); for (int i=1;i<=n;i++) { scanf("%d",&a[i]); for
(int j=1;j<=i;j++) { if (i!=j&&find(a[i]-a[j]))//查詢 { s++;//統計答案 break;//退出迴圈 } } for (int j=1;j<=i;j++) ins(a[i]+a[j]);//加入新的答案 } printf("%d",s); }