2012年3月20日
摘要: POJ_2985 这个题目以cats的个数为关键字建立线段树去做,我为了练一下昨天刚学的SBT所以就用SBT写了,不过SBT的效率要低一些。#include<stdio.h>#include<string.h>#define MAXD 200010#define MAXM 400010int N, M, T, node, p[MAXD], left[MAXM], right[MAXM], key[MAXM], size[MAXM], s[MAXM];int find(int x){ return p[x] == x ? x : (p[x] = find(p[x]));} 阅读全文
posted @ 2012-03-20 15:19 Staginner 阅读(302) 评论(0) 推荐(0) 编辑
摘要: POJ_2761 本来想搜一下SBT的题练一下昨天刚学的SBT的,但这种查询静态区间内的kth number的题目还是用划分树更好写一些,所以就用划分树写了,就当是复习一下前几天学的划分树了。#include<stdio.h>#include<string.h>#include<stdlib.h>#define MAXD 100010int N, M, rank[20][MAXD], sa[MAXD], a[MAXD], h[20][MAXD];int cmp(const void *_p, const void *_q){ int *p = (int *) 阅读全文
posted @ 2012-03-20 13:50 Staginner 阅读(293) 评论(0) 推荐(0) 编辑
摘要: POJ_3481 为了练一下昨天刚学的SBT,所以就用SBT写了,但实际上这个题目可以通过维护一个最大堆和一个最小堆就能实现所有操作。#include<stdio.h>#include<string.h>#define MAXD 1000010int T, node, key[MAXD], client[MAXD], left[MAXD], right[MAXD], size[MAXD];void left_rotate(int &T){ int k = right[T]; right[T] = left[k]; left[k] = T; size[k] = s 阅读全文
posted @ 2012-03-20 12:52 Staginner 阅读(307) 评论(0) 推荐(0) 编辑
摘要: HDU_4006 为了练一下昨天刚学的SBT,所以就用SBT写了,但实际上这个题目只需要维护一个只有k个元素的最小堆即可,每次查询就输出堆顶的元素,如果insert的元素比堆顶元素大,就把堆顶元素删掉,然后把这个insert的元素插入到堆中。#include<stdio.h>#include<string.h>#define MAXD 1000010int N, K, T, left[MAXD], right[MAXD], node, key[MAXD], size[MAXD];void left_rotate(int &T){ int k = right[T] 阅读全文
posted @ 2012-03-20 11:40 Staginner 阅读(265) 评论(0) 推荐(0) 编辑