jzoj3508-好元素【hash,優雅的暴力】
阿新 • • 發佈:2019-01-27
正題
大意
一個序列A,求滿足
這個要求的的個數
解題思路
我們先移一個項
然後用hash表儲存的所有答案,然後到達一個數的時候列舉就可以求出答案
程式碼
#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);
}