版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
洛谷
【题目链接】:http://www.luogu.org/problem/P1638
【题目描述】:
【数据范围】:
【思路】: 经典的two-pointer双指针法(即尺取法)
双指针就是有两个指针
和
。这个方法目的一般是为了统计这样 的二元组的一些信息(比如数量、极值等)
这样的二元组可能描述了一些其他东西,比如说一个闭合区间
如果分析题目性质可以发现,一个指针向一个方向动,另一个指 针也只会单向移动,也就是所谓的“单调性”,那就可以用这个方 法,移动指针的时间复杂度也是线性的
for(int l=r=1;l<=n;l++){
while (r<=n&&check(l,r)) r++;//check(l,r)表示l,r满足条件
r--;//此时,r-1是满足条件的,但r不满足条件
处理一个合法区间[l,r]
}
回归本题,从小到大枚举这个区间的右端点
,能够满足条件的最靠右的左端点
单调不降(当然也可以枚举
,求
)
记录一个数组表示当前区间中每幅画有多少个,再记录一个变量 表示能看到多少幅画。那么区间端点的移动只会带来一个元素的 加入和删除,这两个信息可以很好维护