2013年8月8日
摘要: http://acm.hdu.edu.cn/showproblem.php?pid=4665搜索;搜索前的剪枝:对于某个数num,第一次出现的num标记为0,最后一个出现的num标记为1;搜索中的剪枝:如果不能匹配,一定是错的#include #include #include #include using namespace std;const int maxn = 2002;int a[maxn] , t[maxn] , id[maxn] , n , T , pos[maxn][5];int idd[maxn];int f[maxn] , g[maxn] , cf , cg;void in 阅读全文
posted @ 2013-08-08 19:24 tobec 阅读(587) 评论(0) 推荐(0) 编辑
2013年8月5日
摘要: http://acm.hdu.edu.cn/showproblem.php?pid=4006直接用SBT中的get_max_Kth函数#include #include #include #include using namespace std;#define LL long longconst int maxn = 100010;#define ls T[x].l#define rs T[x].r#define lls T[ls].l#define lrs T[ls].r#define rls T[rs].l#define rrs T[rs].rstruct SBT{ //左子树指针,右子树 阅读全文
posted @ 2013-08-05 22:27 tobec 阅读(195) 评论(0) 推荐(0) 编辑
摘要: 维护一个集合,插入与删除操作,每一步结束之后,输出中位数#include #include #include #include using namespace std;#define LL long longconst int maxn = 100010;#define ls T[x].l#define rs T[x].r#define lls T[ls].l#define lrs T[ls].r#define rls T[rs].l#define rrs T[rs].rstruct SBT{ //左子树指针,右子树指针,大小,键值 int l,r,sz,key; void init(){ . 阅读全文
posted @ 2013-08-05 18:27 tobec 阅读(169) 评论(0) 推荐(0) 编辑
摘要: http://acm.hdu.edu.cn/showproblem.php?pid=3473对于xl,xl+1……xr,使得[xi-x]和最小,显然x应当为其中的中位数。中位数可以通过求K大数解决,划分树可搞。对于求和,分为两部分,小于x的部分,大于y的部分,在建树的时候也保存下来分到左子树中的数的和。最终的和为ave*(lnum-rnum)+rsum-lsumave为中位数,lnum为左子数的数量,也就是小于中位数的数量,rnum为右子数,lsum表示小于中位数部分的和#include #include #include #include using namespace std;#defin 阅读全文
posted @ 2013-08-05 10:54 tobec 阅读(251) 评论(0) 推荐(0) 编辑
2013年8月4日
摘要: 划分树是在建树的过程中保存快速排序。划分树同样以1 5 2 6 3 7为例:根据中位数mid,将区间划分成左子树中的数小于等于mid,右子树中的数大于等于mid,得到这样一棵划分树: [1 5 2 6 3 7] [1 2 3] [5 6 7] [1 2] [3] [5 6] [7] [1] [2] [5] [6]注意要保持下标的先后顺序不变对每一个区间,用sum[i]记录区间的左端点left到i有几个进入了左子树,即有几个数小于等于mid用对应的下标区间建线段树:(这里下标区间对应的是排序后的数列) [1 6] [1 3] [4 6] [1 2] [3] [4 5][6] [1][2... 阅读全文
posted @ 2013-08-04 00:41 tobec 阅读(222) 评论(0) 推荐(0) 编辑
2013年8月3日
摘要: 归并树是在建树的过程中保存归并排序。归并树以1 5 2 6 3 7为例:把归并排序递归过程记录下来即是一棵归并树: [1 2 3 5 6 7] [1 2 5] [3 6 7] [1 5] [2] [6 3] [7] [1][5] [6][3]用对应的下标区间建线段树:(这里下标区间对应的是原数列) [1 6] [1 3] [4 6] [1 2] [3] [4 5][6] [1][2] [4][5]每次查找[l r]区间的第k大数时,在[1 2 3 4 5 6 7]这个有序的序列中二分所要找的数x,然后对应到线段树中去找[l r]中比x小的数有几个,即x的rank。由于线段树中任意... 阅读全文
posted @ 2013-08-03 22:13 tobec 阅读(202) 评论(0) 推荐(0) 编辑
摘要: http://acm.hdu.edu.cn/showproblem.php?pid=4616转载自http://blog.csdn.net/tri_integral/article/details/9499037题意:给出一棵树,树上每个节点都有权值,某些点有陷阱。可以任选起点,每个点只能走过一次,如果走到某点不能再走或者走到某个点恰好走了C个陷阱就停在该点,问最后路径上点权之和能得到的最大值。题解:树形DP。用dp[u][j]表示以u为根的子树上,从某点走到u且走过j个陷阱能得到的最大值;考虑如果最优解走过了k个陷阱,如果k!=C,那么其起点和终点都可以为没有陷阱的点,如果k=C,那么起点或 阅读全文
posted @ 2013-08-03 00:17 tobec 阅读(241) 评论(0) 推荐(0) 编辑
摘要: http://acm.hdu.edu.cn/showproblem.php?pid=4612双连通分量 + 树的直径一样的代码 C++ 交了两遍过的 , 看了网上的第一行 , 手动 设定 栈空间#pragma comment(linker,"/STACK:102400000,102400000")#include #include #include #include #include #include using namespace std;#define inf (1 g[maxn];void solve() { idx = cnt = top = 0; memset(d 阅读全文
posted @ 2013-08-03 00:11 tobec 阅读(205) 评论(0) 推荐(0) 编辑
2013年8月2日
摘要: http://projecteuler.net/problem=5Answer:232792560 阅读全文
posted @ 2013-08-02 23:18 tobec 阅读(89) 评论(0) 推荐(0) 编辑
摘要: http://projecteuler.net/problem=4答案:906609 阅读全文
posted @ 2013-08-02 23:01 tobec 阅读(97) 评论(0) 推荐(0) 编辑