YBTOJ:求好元素(哈希表)
生活随笔
收集整理的這篇文章主要介紹了
YBTOJ:求好元素(哈希表)
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
文章目錄
- 題目描述
- 解析
- 代碼
題目描述
解析
如果枚舉m,n,p的話是n3的
會(huì)超時(shí)
但我們注意到右邊查詢只有O(n)
這就很不平衡
所以考慮把p移到右邊,預(yù)處理枚舉m、n存到哈希表中
查詢枚舉i、p
這樣就把復(fù)雜度均攤降到了n2
但是本題數(shù)據(jù)較強(qiáng)
所以我們得保證哈希表的單詞查詢復(fù)雜度近似于O1
因此我們需要一個(gè)1e7左右的質(zhì)數(shù)
此外,還要注意點(diǎn)的個(gè)數(shù)和邊數(shù)都應(yīng)該是n2級(jí),3e7左右
好在本題空間復(fù)雜度是比較充裕的
可以通過(guò)
代碼
#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 */總結(jié)
以上是生活随笔為你收集整理的YBTOJ:求好元素(哈希表)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 撩人情话污一点的 把对象撩到湿的污句子
- 下一篇: YBTOJ:公共子串(KMP)