摘要: 题意: 在给出的区间内求出最大买进卖出的差价。思路: 对于弱数据:维护一个从左到右的最大差价和最小值。即当发现当前值比最小值小的时候更新最小值,否则看一下当前值与之前最小值的差价是否比最大差价大,是就更新最大差价。时间复杂度是O(m*n) 对于强数据:利用线段树维护一个最大差价、最大值和最小值,查询的时候求出询问的范围内左右子树的最大差价,然后再利用RMQ求出[l, mid]的最小值和[mid+1, r]的最大值,然后返回max(df[rt 2 #include 3 #include 4 #include 5 using namespace std; 6 7 const int... 阅读全文
posted @ 2013-11-20 15:21 Griselda. 阅读(272) 评论(0) 推荐(0) 编辑
摘要: 题意: 给出一个有n个数的数列,并定义mex(l, r)表示数列中第l个元素到第r个元素中第一个没有出现的最小非负整数。 求出这个数列中所有mex的值。 思路: 可以看出对于一个数列,mex(r, r~l)是一个递增序列 mex(0, 0~n-1)是很好求的,只需要遍历找出第一个没有出现的最小非负整数就好了。这里有一个小技巧:1 tmp = 0;2 for (int i = 1; i = 1; --i) {2 if (mp.find(arr[i]) == mp.end()) next[i] = n+1;3 else next[i] = ... 阅读全文
posted @ 2013-11-20 14:54 Griselda. 阅读(624) 评论(0) 推荐(0) 编辑
摘要: 题目: 曹操在长江上建立了一些点,点之间有一些边连着。如果这些点构成的无向图变成了连通图,那么曹操就无敌了。刘备为了防止曹操变得无敌,就打算去摧毁连接曹操的点的桥。但是诸葛亮把所有炸弹都带走了,只留下一枚给刘备。所以刘备只能炸一条桥。 题目给出n,m。表示有n个点,m条桥。 接下来的m行每行给出a,b,c,表示a点和b点之间有一条桥,而且曹操派了c个人去守卫这条桥。 现在问刘备最少派多少人去炸桥。 如果无法使曹操的点成为多个连通图,则输出-1. 思路: 就是用tarjan算法算出桥的数量,再比较哪一个的值最小。Tips: 注意三点: ①. 有重边,所以tarjan算法要处理重边... 阅读全文
posted @ 2013-11-20 13:40 Griselda. 阅读(1788) 评论(0) 推荐(0) 编辑
摘要: 题意: 我们定义十进制数x的权值为f(x) = a(n)*2^(n-1)+a(n-1)*2(n-2)+...a(2)*2+a(1)*1,a(i)表示十进制数x中第i位的数字。 题目给出a,b,求出0~b有多少个不大于f(a)的数。思路: 数位DP,用来学习数位DP了。 所谓数位DP就是基于考虑数字的每一位来转移的DP。 例如求比456小的数,可以这么考虑, 4 5 6 4 5 (0~6) 4 (0~4) (0~9) (0~3)(0~9) (0~9) ... 阅读全文
posted @ 2013-11-20 12:47 Griselda. 阅读(2407) 评论(0) 推荐(1) 编辑