2012年8月24日
摘要: UVALive_4976 这个题目可以先预处理出每个点向左走一共有多少个连续下降的元素,以及向右走一共有多少个连续上升的元素,处理出这两个东西后思路基本就有了。 接下来用线段树也可以做,或者可以借鉴O(NlogN)求解最长上升子序列的方法的思想来做,但后者效率更高一些。#include<stdio.h>#include<string.h>#include<algorithm>#define MAXD 200010int N, a[MAXD], s[MAXD], R[MAXD], top;void init(){ int i; scanf("%d&q 阅读全文
posted @ 2012-08-24 21:30 Staginner 阅读(533) 评论(1) 推荐(1) 编辑
摘要: UVA_11192 如果是在一维的序列上进行这些操作的话,那么线段树就可以了。不过现在题目将这些操作拓展到了二维,回想线段树的本质是二分线段,那么对于一个二维的矩阵,拓展一下就应当是四分矩阵了。#include<stdio.h>#include<string.h>#include<algorithm>#define MAXD 1000010#define INF 0x3f3f3f3fint N, M, P, node;struct SegTree{ int x1, y1, x2, y2, sum, min, max, add, to, son[4], are 阅读全文
posted @ 2012-08-24 16:26 Staginner 阅读(304) 评论(0) 推荐(0) 编辑
摘要: UVA_11996 这个题目前三个操作都是典型的splay的操作,但是第四个操作之前没见过,我以前只用字典树+二分求过任意两个串的LCP,但这次是在splay上便一时间无从下手。后来看了别人的代码发现也是基于二分的,而至于如何判断二分出来的前缀是相同的,则直接用哈希值去比较了。 至于直接用哈希值判断两个字符串是否相等,我一开始也觉得很不靠谱,后来分析了一下发现虽然不靠谱但不靠谱的概率是比较小的。假定我们用一个long long的哈希值,它可以区分出2^64个不同的字符串(当然这只是极限情况,如果哈希算法不同所能表示的字符串的数量也不大相同),而题目的01串至多也就400,000位,这样即便.. 阅读全文
posted @ 2012-08-24 13:04 Staginner 阅读(584) 评论(0) 推荐(0) 编辑