目录

双指针

1523

同时使用两个指针,在序列、链表结构上指向的是位置,在树、图结构中指向的是节点,通过或同向移动,或相向移动来维护、统计信息。

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 逆向思维

快慢指针

判断链表是否成环


推荐文章

滑动窗口
bfs