1. 程式人生 > 其它 >NOI Online 2022 一遊

NOI Online 2022 一遊

NOI Online 2022 一遊

TG

啊,上午比提高,根據去年的經驗,題目配置估計那至少一黑

所以直接做 1 題即可。(確信)

總體:估分 140,炸了但沒完全炸

奇怪的過程

開題:3 2 1 (霧

事情是這樣的:我又根據經驗,覺得 T1 不會太簡單。。。

突然發現 T3 和 T2 似乎可做,恩?然後 T3 搞半天發現一個需要 cdq 的神奇東西

果斷放棄。


接著看 T2 ,好吧,不知腦子如何靈光,我越看越像字串?

這也是往年經驗:去年考的字串,今年可能還考。

折騰了 0.5h 的自動機,字典樹,雜湊,最後依然放棄

思考的演算法,也是從正解,到 70,最後 40。。。


終於看到 T1,仔細地思考,發現就是一個長得和

彈飛綿羊 詢問神似的東西,

還不用修改,這不,直接倍增?用若干分鐘碼完,調了一下過了大樣例,大概是我唯一能 A 的題

  • 大致思路:預處理出這個點在全域性在哪個點加入時彈出

    那麼在這中間的點一定不是“成功的”,因為至少有這個點在棧中

    可以連邊,一定形成一顆樹,問題就轉換成一個點往上跳多少次才能跳出區間

    用倍增即可

#include <bits/stdc++.h>
using namespace std;
typedef unsigned long long uLL;
typedef long double LD;
typedef long long LL;
typedef double db;
const int N = 5e5 + 5;
inline int Rd() {
    register int x = 0; char C = getchar();
    for (; C < '0' || C > '9'; C = getchar()) ;
    for (; C > '/' && C < ':'; C = getchar()) x = (x << 1) + (x << 3) + (C ^ 48);
    return x;
}
int n, Ti, a[N], b[N], st[N], top, t[N], lst[N], Ecnt, dep[N], Q[N], hd, tl, fa[N][25];
struct Ed { int to, nxt; } e[N << 1];
inline void Ae(int fr, int go) {
    e[++Ecnt] = (Ed){ go, lst[fr] }, lst[fr] = Ecnt;
}
inline void bfs() {
    fa[n + 1][0] = n + 1;
    Q[++tl] = n + 1;
    for (int u; hd < tl; ) {
        u = Q[++hd];
        for (int i = lst[u], v; i; i = e[i].nxt) {
            v = e[i].to, dep[v] = dep[u] + 1;
            fa[v][0] = u, Q[++tl] = v;
        }
    }
}
inline int work(int x, int lim) {
    register int St = x;
    for (int i = 19; ~i; i--)
        if (fa[x][i] <= lim) x = fa[x][i];
    return dep[St] - dep[x] + 1;
}
int main() {
    freopen("stack.in", "r", stdin);
    freopen("stack.out", "w", stdout);
    n = Rd(), Ti = Rd();
    for (int i = 1; i <= n; i++) a[i] = Rd();
    for (int i = 1; i <= n; i++) b[i] = Rd();
    for (int i = 1; i <= n; i++) {
        while (top && (a[st[top]] == a[i] || b[st[top]] <= b[i])) t[st[top--]] = i;
        st[++top] = i;
    }
    while (top) t[st[top--]] = n + 1;
    for (int i = 1; i <= n; i++) Ae(t[i], i);
    bfs();
    for (int j = 1; j <= 19; j++)
        for (int i = 1; i <= n + 1; i++)
            fa[i][j] = fa[fa[i][j - 1]][j - 1];
    for (int l, r; Ti--; ) {
        l = Rd(), r = Rd();
        printf("%d\n", work(l, r));
    }
}

點真不戳,寫完 T1 就 11 點了,去寫了 T2 的 40 和 T3 的 10 分就滾蛋了

關鍵是 T2 的 40 還寫掛了?輸得這麼徹底~

賽後

竟然是 2藍 + 1 紫?難度比去年差距可不小

其他人 T1 用 線段樹(或 BIT)+ 離線,omg 我真的想不到

不過我的倍增常數絕對小(蜜汁自信

lage T2 以優秀的複雜度過了大樣例?%%%

總結

  1. 不能憑藉以前的經驗
  2. 仔細思考,不寫掛暴力
  3. 多方面思考

PJ

下午 pj ,炸上天。

t1 送分,10 min 切了後,剩下的時間交給 t2 ,t3

然後 t2 坐電腦前 2.5h 推不出規律,,,

打了個暴力。。。

剩下的時間去想 t3,由於自身能力與心態吧。

一個四維 dp 沒想到,也是暴力。

炸了,%%% ljh t3 過大樣例

總結

  1. 數學思維
  2. dp

總結

可能是最後一次 online 了,

存者且偷生,希望我能盡力補全 dp、數學短板