uva 1608(分治 + 中途相遇法)
2017-08-16 20:55
465 查看
参考紫书,利用stl map,找到数组中相同元素的关系。每找到一个所求范围唯一元素,对元素所在的范围进行分治。
注意:不能用prev和next作数组名会使juge无法判断
注意:不能用prev和next作数组名会使juge无法判断
#include<cstdio> #include<map> using namespace std; const int maxn = 200000 + 5; int num[maxn], pre[maxn], nex[maxn]; map<int, int> cur; inline bool arry_unique(int p, int L, int R) { //printf("%d %d,%d\n", p, pre[p],nex[p]); return (pre[p] < L && nex[p] > R); } bool check(int L, int R) { if(L >= R) return true; for(int d = 0; L + d <= R - d; d++) { //printf("%d\n", d); if(arry_unique(L + d, L, R)) return check(L, L + d - 1) && check(L + d + 1, R); if(L + d == R - d) break; if(arry_unique(R - d, L, R)) return check(L, R - d -1) && check(R - d + 1, R); } return false; } int main() { int T; scanf("%d", &T); while(T--) { cur.clear(); int n; scanf("%d", &n); for(int i = 0; i < n; i++) scanf("%d", &num[i]); for(int i = 0; i < n; i++) { if(!cur.count(num[i])) pre[i] = -1; else { pre[i] = cur[num[i]]; } cur[num[i]] = i; } cur.clear(); for(int i = n - 1; i >= 0; i--) { if(!cur.count(num[i])) nex[i] = n; else{ nex[i] = cur[num[i]]; } cur[num[i]] = i; } int L = 0, R = n - 1; //continue; if(check(L, R)) printf("non-boring\n"); else printf("boring\n"); } return 0; }
相关文章推荐
- UVA 1608 Non-boring sequence 不无聊的序列(分治,中途相遇)
- UVa 1608 (分治 中途相遇) Non-boring sequences
- 分治法,中途相遇法(Non-boring sequences,uva 1608)
- UVA - 1608 Non-boring sequences(递归分治,中途相遇)
- Jurassic Remains UVALive - 2965(中途相遇法)
- uva1326 - Jurassic Remains 中途相遇法
- UVA12904 Load Balancing(中途相遇法)
- UVA 1608 Non-boring sequences (递归分治)
- UVA - 1152 4 Values whose Sum is 0 【中途相遇法/二分】
- uva10125 (中途相遇法)
- UVA - 1608 Non-boring sequences : 分治
- 例题1.25 侏罗纪 Jurassic Remains UVALive - 2965 状态压缩 + 中途相遇法
- UVA 1152 4 Values whose Sum is 0 中途相遇法 二分查找
- UVA - 1608 Non-boring sequences 递归,分治
- 中途相遇法,哈希技术(和为0的4个值,uva 1152)
- 【UVALive】2965 Jurassic Remains 中途相遇法
- UVA 1326 Jurassic Remains 中途相遇法
- Building for UN UVA - 1605 (中途相遇法)
- Uva1152 4 Values whose Sum is 0 【中途相遇+二分】【例题8-3】
- uva 1152 和为0的4个值(中途相遇法)