YBTOJ:求好元素(哈希表)
生活随笔
收集整理的這篇文章主要介紹了
YBTOJ:求好元素(哈希表)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 題目描述
- 解析
- 代碼
題目描述
解析
如果枚舉m,n,p的話是n3的
會超時
但我們注意到右邊查詢只有O(n)
這就很不平衡
所以考慮把p移到右邊,預處理枚舉m、n存到哈希表中
查詢枚舉i、p
這樣就把復雜度均攤降到了n2
但是本題數據較強
所以我們得保證哈希表的單詞查詢復雜度近似于O1
因此我們需要一個1e7左右的質數
此外,還要注意點的個數和邊數都應該是n2級,3e7左右
好在本題空間復雜度是比較充裕的
可以通過
代碼
#include<bits/stdc++.h> using namespace std; #define ll long long typedef unsigned long long ull; const int N = 3e7+100; const int M=1e7+5; const ll mod=1e7+3; int n; int a[5050]; int fi[M],cnt=-1; int num[N],tot=0; struct node{int to,nxt; }p[N]; void addline(int x,int y){p[++cnt]=(node){y,fi[x]};fi[x]=cnt; } bool find(int x){int o=x%mod;if(o<0) o+=mod;for(int i=fi[o];~i;i=p[i].nxt){int to=p[i].to;if(num[to]==x) return true;}return false; } void put(int x){int o=x%mod;if(o<0) o+=mod;num[++tot]=x;addline(o,tot); } int main(){memset(fi,-1,sizeof(fi));//printf("%d",sizeof(num)/1024/1024);scanf("%d",&n);for(int i=1;i<=n;i++) scanf("%d",&a[i]);int ans=0;for(int i=1;i<=n;i++){for(int j=1;j<i;j++){int x=a[i]-a[j];if(find(x)){ans++;break;}}for(int j=1;j<=i;j++){int x=a[i]+a[j];if(!find(x)) put(x);}}printf("%d",ans);return 0; } /* 3 1 2 3 4 5 6 7 8 9 5 6 7 8 9 1 2 3 4 */總結
以上是生活随笔為你收集整理的YBTOJ:求好元素(哈希表)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 撩人情话污一点的 把对象撩到湿的污句子
- 下一篇: YBTOJ:公共子串(KMP)