UVa 1608 (分治 中途相遇) Non-boring sequences
2015-04-16 13:28
363 查看
预处理一下每个元素左边和右边最近的相邻元素。
对于一个区间[l, r]和区间内某一个元素,这个元素在这个区间唯一当且仅当左右两边最近的相邻元素不在这个区间内。这样就可以O(1)完成查询。
首先查找整个字符串是否有唯一元素,如果没有则整个序列是无聊的。
有的话,假设这个唯一元素下标是p,那么如果子序列[0, p-1]和[p+1, n-1]是不无聊的,那么这个序列就是不无聊的。
关于查找的话,如果只从一端查找唯一元素,最坏的情况就是O(n)。所以可以从两端进行查找,总的时间复杂度是O(nlogn)。
代码君
对于一个区间[l, r]和区间内某一个元素,这个元素在这个区间唯一当且仅当左右两边最近的相邻元素不在这个区间内。这样就可以O(1)完成查询。
首先查找整个字符串是否有唯一元素,如果没有则整个序列是无聊的。
有的话,假设这个唯一元素下标是p,那么如果子序列[0, p-1]和[p+1, n-1]是不无聊的,那么这个序列就是不无聊的。
关于查找的话,如果只从一端查找唯一元素,最坏的情况就是O(n)。所以可以从两端进行查找,总的时间复杂度是O(nlogn)。
#include <bits/stdc++.h> using namespace std; const int maxn = 200000 + 10; int a[maxn], L[maxn], R[maxn]; map<int, int> cur; inline bool ok(int pos, int l, int r) { return L[pos] < l && R[pos] > r; } bool solve(int l, int r) { if(l >= r) return true; for(int i = 0; l+i <= r-i; i++) { if(ok(l+i, l, r)) return solve(l, l+i-1) && solve(l+i+1, r); else if(ok(r-i, l, r)) return solve(l, r-i-1) && solve(r-i+1, r); } return false; } int main() { //freopen("in.txt", "r", stdin); int T; scanf("%d", &T); while(T--) { int n; scanf("%d", &n); for(int i = 0; i < n; i++) scanf("%d", &a[i]); cur.clear(); for(int i = 0; i < n; i++) { L[i] = cur.count(a[i]) ? cur[a[i]] : -1; cur[a[i]] = i; } cur.clear(); for(int i = n-1; i >= 0; i--) { R[i] = cur.count(a[i]) ? cur[a[i]] : n; cur[a[i]] = i; } printf("%s\n", solve(0, n-1) ? "non-boring" : "boring"); } return 0; }
代码君
相关文章推荐
- UVA 1608 Non-boring sequence 不无聊的序列(分治,中途相遇)
- uva 1608(分治 + 中途相遇法)
- 分治法,中途相遇法(Non-boring sequences,uva 1608)
- UVA 1608:Non-boring sequences(递归+分治思想)
- UVa 1608:Non-boring swquences(分治)
- UVA - 1608 Non-boring sequences : 分治
- UVa 1608 Non-boring sequences (分治)
- UVa 1608 Non-boring sequence (分治)
- UVA 1608 Non-boring sequences 递归分治
- UVA - 1608 Non-boring sequences 递归,分治
- UVA - 1608 Non-boring sequences 递归(分治思想)
- Uva 1608 Non-boring sequences(分治)
- UVA 1608 Non-boring sequences (递归分治)
- UVA - 1608 Non-boring sequences(递归分治,中途相遇)
- Uva10125/POJ2549——Sumsets(中途相遇法,hash)
- UVA 1608 Non-boring sequences
- Uva1152 查找优化的四种方法 中途相遇法
- uva10125 (中途相遇法)
- 8.5-237-uva1152-中途相遇法-二分法
- uva 1326 Jurassic Remains(中途相遇法+位运算)