摘要:        
维护一个单调栈,保持从大到小的顺序,每次加入一个元素都将其推到尽可能栈底,知道碰到一个比他大的,然后res+=tail,说明这个cow的头可以被前面tail个cow看到。如果中间出现一个超级高的,自然会推到栈底,即此元素以前的cow看不到此元素后面cow的头,即res不会加此元素前面的个数,说明是正确的。注意要用long long 或者 __int64类型。 刚开始看着80000不大的样子,其实最大情况下res有 1+2+....+80000 = 3200040000,超过int范围。以后还是验证一下,或者看到这种比较大的数还是优先用long long 或者 __int64类型吧。代码:#in    阅读全文
posted @ 2014-02-26 14:37
whatbeg
阅读(193)
评论(0)
推荐(0)
        
            
        
        
摘要:        
做法:维护一个单调递减序列,只需输出序列中的第一个元素即可。对于命令我们可以进行不同的处理:如果是Q命令,则判断当前队列中是否仍有元素,如果没有则输出-1,如果有则直接输出队首。如果是G命令,则对last加1,之后对于队列中所有超出范围的前端元素进行出队操作。(该元素在原序列中的位置>=last)如果是C命令,则将该元素加入队列中,并和队尾元素比较,维护队列的单调性。这里考虑一个问题,当前元素加如后对队尾元素为什么可以毫无保留的删去呢?因为当前元素面试时间一定比队尾元素晚,所以如果当前元素比队尾元素大,则在当前元素被删去之前,删去队尾元素不影响最大值。代码:#include #inclu    阅读全文
posted @ 2014-02-26 09:20
whatbeg
阅读(330)
评论(0)
推荐(0)
        
            
        
        
摘要:        
重新刷这个经典题,感觉跟以前不一样了,变得更加容易理解了,不讲解了,看代码。注意:要用C++提交,用G++会超时。。代码:#include #include #include using namespace std;#define N 1000007int a[N],mp[N],head,tail,n,k;inline void pushup(int i){ while(tail > head && a[i] head && a[i] > a[mp[tail-1]]) tail--; mp[tail++] = i;}void solve(int cm    阅读全文
posted @ 2014-02-26 09:14
whatbeg
阅读(261)
评论(0)
推荐(0)
        


 
         浙公网安备 33010602011771号
浙公网安备 33010602011771号