題目大意:給乙個序列,問這個序列無不無聊,不無聊序列的定義是任意的連續序列中都能找到乙個只出現過一次的數字
題目思路:首先給乙個序列,這個序列中滿足有乙個只出現過一次的數字,那麼,在這個序列中,所有跨過這個數字的區間一定都是不無聊的,所以想出現無聊的數字一定得在兩邊找,那麼就可以想到利用分治。然後使用map幫助記錄每個數字前乙個離它最近的與它相同的值的位置,以及後乙個離它最近的與它相同值的位置。如果左邊的小於當前分治區間的左位置,右邊大於,那麼在這個區間內他就只出現過一次,繼續分治,如果找不到那就說明涼了
這題有個要注意的就是要左邊右邊一起找,否則會超時
以下是**:
#includeusing namespace std;
#define inf 0x3f3f3f3f
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define per(i,a,b) for(int i=a;i>=b;i--)
#define ll long long
const int maxn=2e5+5;
const int mod =1e9+7;
int n,a[maxn],l[maxn],r[maxn];
unordered_mapmp;
bool solve(int posl,int posr)
return 0;
}int main()
else
mp[a[i]]=i;
}mp.clear();
per(i,n,1)
else
mp[a[i]]=i;
}if(solve(1,n))
else
}return 0;
}
啟發式與元啟發式演算法
啟發式演算法 heuristic algorigthm 是一種基於直觀或經驗構造的演算法,在可接受的花費 指計算時間 計算空間等 給出待解決優化問題的每一例項的乙個可行解,該可行解與與最優解的偏離程度一般不可以事先預計。啟發式演算法是一種技術,這種演算法可以在可接受的計算費用內找到最好的解,但不一定...
uva 1608 分治 中途相遇法
參考紫書,利用stl map,找到陣列中相同元素的關係。每找到乙個所求範圍唯一元素,對元素所在的範圍進行分治。注意 不能用prev和next作陣列名會使juge無法判斷 include includeusing namespace std const int maxn 200000 5 int nu...
關於啟發式演算法 元啟發式演算法以及超啟發式演算法的理解
定義 啟發式演算法 heuristic algorithm 是相對於最優化演算法提出的。乙個問題的最優演算法求得該問題每個例項的最優解。啟發式演算法可以這樣定義 乙個基於直觀或經驗構造的演算法,在可接受的花費 指計算時間和空間 下給出待解決組合優化問題每乙個例項的乙個可行解,該可行解與最優解的偏離程...