20220219模擬 T1貨幣

2022-09-22 03:24:08 字數 2339 閱讀 5439

我們考慮設 \(f_i\) 表示當 \(i\) 作為右端點的時候,它的左端點最大是多少能夠包含所有顏色

我們考慮設 \(nxt_i\) 表示 \(i\) 後面第乙個和它顏色一樣的位置是**

那麼 \(f_i\) 的計算方式就是 \(min \ }\)

我們發現我們用 \(set\) 維護 \(pos\) 啟發式合併就可以在求 \(nxt_i\) 的地方做到 \(o(n \log^2 n)\) 的複雜度

現在我們考慮怎麼在更改 \(nxt\) 的時候維護 \(f\)

有個顯然的結論是說 \(f\) 必然是單調不降的

我們考慮將乙個位置 \(x\) 插入到另乙個顏色的 \(set\) 裡面

我們考慮用線段樹維護 \(nxt\) 這樣就可以做到在 \(o(\log n)\) 的時間裡求出乙個 \(f_i\) 了

我們先考慮怎麼算答案

我們再開一棵線段樹去維護 \(f\) ,並且用乙個 \(set\) 去維護每個聯通塊的 \(min\)

那麼答案就是必然包含了所有的連通塊的點作 \(r\) 也就是 \((*s.rbegin()) \leq r\) 它們的 \(min \ \ i-f_i\)

現在我們考慮如果要修改乙個點 \(x\) 的 \(nxt\) 它會帶來什麼影響

容易發現它會影響的區間 \([l,r]\) 一定滿足 \(i \in [l,r],f_i=x\)

那麼我們將這段區間單獨提出來做修改

每次我們查詢當前位置的 \(f\) 那麼它能延伸到的位置必然為 \(nxt_f\) (考慮 \(f\) 和 \(nxt\) 的定義容易發現這件事)於是我們直接暴力跳著修改,由於這個玩意兒可以看成區間取 \(max\) 所以時間複雜度是嚴格 \(o(n \log n)\) 的

那麼我們修改一段區間的 \(f\) 直接用線段樹維護就完了,總時間複雜度 \(o(n \log^2 n)\)

(由於博主本人現在有點困,所以寫的沒啥邏輯等明天再來改)

code

#include #define ll long long

#define rep(a,b,c) for(int a=(b);a<=(c);a++)

#define per(a,b,c) for(int a=(b);a>=(c);a--)

#define rep(a,b,c) for(int a=(b);a<(c);a++)

#define per(a,b,c) for(int a=(b);a>(c);a--)

#define vi vector#define pb emplace_back

#define ls rt<<1

#define rs rt<<1|1

using namespace std;

const int n=1e5;

setpos[n+5],mx;

int fa[n+5];

int n,q,t,laans,ans,nxt[n+5],pre[n+5];

inline int find(int x)

struct sgt1

inline void upd_(int k,int ch,int rt=1,int l=1,int r=n)

inline int qry_(int k,int rt=1,int l=1,int r=n)

#undef mid

}nt;

struct sgt2

inline void bld_(int rt,int l=1,int r=n)

inline void pd_(int rt)

inline void cov_(int l,int r,int ch,int rt=1,int l=1,int r=n)

inline int qry_(int k,int rt=1,int l=1,int r=n)

inline int qmn_(int k,int rt=1,int l=1,int r=n)

inline int get_(int k,int rt=1,int l=1,int r=n)

#undef mid

}t;inline void upd(int x,int y)

//printf("%d %d\nchange %d , %d\n",x,y,l,r); printf("now f = "); rep(i,1,n) printf("%d ",nt.qry_(i)); puts("");

}int main()

} //printf("now element in mx : "); for(int x:mx) printf("%d ",x); puts("");

printf("%d\n",laans=t.qmn_(*mx.rbegin()));

}}

16 1112 模擬考試 T1

加密 問題描述 有一種不講道理的加密方法是 在字串的任意位置隨機插入字元。相應的,不講道理的解密方法就是從字串中恰好刪去隨機插入的那些字元。給定原文s和加密後的字串t,求?有多少子串可以通過解密得到原文s。輸入格式 輸入第一行包含乙個字串t,第二行包含乙個字串s。輸出格式 輸出一行,包含乙個整數,代...

4 21小A模擬賽 T1

description 乙個無限長的01 序列,初始全為0,每次選擇乙個區間 l,r 進行操作,有三種操作 1 l r 將 l,r 中所有元素變成1。2 l r 將 l,r 中所有元素變成0。3 l r 將 l,r 中所有元素異或上1。每次操作後詢問最左邊的0 在哪個位置。input format ...

YCH的模擬賽 T1

括號序列問題,往往就是把左括號看成 1,右括號看成 1,我們只需要保證任意乙個字首大於等於0,且總和為0,就代表是個合法括號序列了。令 f i j 表示當前到第 i 個字元,現在的字首和 j 那麼分三種情況考慮。若第 i 1 個字元是左括號,則能轉移到 f i 1 j 1 若第 i 1 個字元是右括...