2012年8月23日
摘要: UVA_11994 这个题目思维上的障碍比较少,因为实际上都是link-cut-tree的基本的操作,还有一个更为复杂的link-cut-tree的题目——HDU_4010。 在维护路径上边的颜色的数量时,由于颜色的种类只有30个,因此可以用一个整数的30个二进制位来存储颜色的种类。#include<stdio.h>#include<string.h>#define MAXD 50010int N, M;struct Splay{ int pre, ls, rs, col, set, to, size; bool root; void pushdown(); void 阅读全文
posted @ 2012-08-23 19:24 Staginner 阅读(448) 评论(0) 推荐(0) 编辑
摘要: UVA_11997 由于K行处理起来比较繁琐,所以一个可行的思路是就当作两行处理,这样处理K-1次就可以了。 对于只有两行的情况,可以考虑怎样才能够一个一个的将和由小到大构造出来,这一点可以借助优先级队列来实现:先将两个最小的放进去,之后每次都取出和最小的那两个数,然后尝试将第一个数换成第一行的稍大一点的数后放到优先级队列中,然后再尝试将第二个数换成第二行稍大一点的数放到优先级队列中。这样从优先级队列中取出的前K个元素就是前K小的和。#include<stdio.h>#include<string.h>#include<algorithm>#define m 阅读全文
posted @ 2012-08-23 14:21 Staginner 阅读(628) 评论(0) 推荐(0) 编辑
摘要: UVA_11995 如果还可能是某个数据结构的话,就对其模拟操作,知道出现错误为止。#include<stdio.h>#include<string.h>#include<algorithm>#define MAXD 1010int N, D, max[4 * MAXD], q[MAXD], s[MAXD];void init(){ for(D = 1; D < N + 2; D <<= 1); memset(max, 0, sizeof(max[0]) * 2 * D);}void update(int i){ for(; i ^ 1; 阅读全文
posted @ 2012-08-23 13:04 Staginner 阅读(221) 评论(0) 推荐(0) 编辑
摘要: UVA_11991 先将所有值排个序,剩下的工作就比较好办了。#include<stdio.h>#include<string.h>#include<algorithm>#define MAXD 100010struct Point{ int id, v; bool operator < (const Point &t) const { if(v == t.v) return id < t.id; return v < t.v; }}p[MAXD];int N, M;void init(){ int i;... 阅读全文
posted @ 2012-08-23 12:32 Staginner 阅读(344) 评论(0) 推荐(0) 编辑