双指针
同时使用两个指针,在序列、链表结构上指向的是位置,在树、图结构中指向的是节点,通过或同向移动,或相向移动来维护、统计信息。
Contest Proposal 两个指针在两个序列操作
滑动窗口
Boring Day 又是无聊的一天,埃戈尔觉得无聊,决定做点什么。但因为没有朋友,他就想出了一个游戏。
埃戈尔有一副 $n$ 的扑克牌,最上面的 $i$ 张牌上写着数字 $a_i$ 。埃戈想玩一定轮数的游戏,直到牌用完为止。在每一轮中,他都会从牌面顶端抽取非零张牌,然后结束这一轮。如果在这一轮中收集到的纸牌上的数字之和在 $l$ 和 $r$ 之间(包括首尾数字),则这一轮获胜;否则,这一轮失败。
埃戈尔对纸牌的顺序了如指掌。请帮助 Egor 确定他在这样的游戏中最多可以赢多少局。请注意,伊戈尔不需要连续赢几轮。
经典的滑动窗口问题
void solve() {
int n, l, r;
cin >> n >> l >> r;
int a[n + 1];
_rep(i, 1, n) cin >> a[i];
ll cur = 0;
int cnt = 0;
int L = 1,R = 1;
while (L <= n) {
while(R <= n && cur < l) {
cur += a[R];
R++;
}
if(l <= cur && cur <= r) {
cnt++;
L = R;
cur = 0;
} else {
cur -= a[L];
L++;
}
}
cout << cnt << endl;
}
对撞指针
LR-remainders 逆向思维
快慢指针
判断链表是否成环