![題解:AT_abc477_d [ABC477D] Masking Tape](http://pic.xiahunao.cn/yaotu/題解:AT_abc477_d [ABC477D] Masking Tape)
題意簡述N 個格子初始顏色全是a。操作1 X格子 X 膠帶狀態(tài)切換 —— 有膠帶就撕掉沒膠帶就貼上。操作2 C所有當前沒有膠帶的格子全部改成顏色c。有膠帶的格子不受這次染色影響。我們維護 2 個數組lst[]時間戳記錄這個格子最近一次撕掉膠帶是第幾號查詢ok[]bool表示當前 x 格子有沒有貼膠帶。1表示貼了0表示沒貼。再維護 1 個變量g保存最近一次 type2 的顏色。核心思路如果是 1 X翻轉膠帶情況 A本來沒有膠帶現(xiàn)在貼上膠帶貼上膠帶之后后面所有 type2 染色都碰不到這個格子。 那貼上去這一刻格子的顏色是什么 如果這個格子上次撕膠帶的時間lst[x] ≤ 最近一次染色時間dq說明在貼膠帶前它已經被全局染成g了。把這個顏色存到c[x]固定下來。ok[x]1標記貼上膠帶。情況 B本來貼著現(xiàn)在撕掉撕掉之后這個格子會接收之后所有 type2 染色。 我們只要記下這次撕膠帶發(fā)生在第i號查詢。lst[x]i。ok[x]0標記被撕。如果是 2 C全局染色無膠帶格子改成 C不用循環(huán)直接更新全局變量gCdqi把這次染色的查詢號記下來。最后輸出答案的時候對每個格子 i如果ok[i]true現(xiàn)在還貼著膠帶。膠帶擋住后面所有染色它的顏色就是當初貼膠帶那一刻存下來的c[i]。如果ok[i]false現(xiàn)在沒有膠帶那要看【撕掉膠帶的時間】和【最后一次全局染色時間】誰更晚就行了。完整代碼#includebits/stdc.h #define fr1(i,a,b) for(int (i)(a);(i)(b);(i)) #define fr2(i,a,b) for(int (i)(a);(i)(b);--(i)) #define fr3(i,a,b,n) for(int (i)(a);(i)(b);(i)(n)) #define fr4(i,a,b,n) for(int (i)(a);(i)(b);(i)-(n)) #define fv(i,p) for(auto (i):(p)) #define written using #define ll long long #define ull unsigned ll #define pii pairint,int #define pll pairll,ll #define by namespace #define _1st first #define _2nd second #define qz5zwangzihan1 std #define y1 yy1 #define elif else if #define RT return #define debug coutendl-------------------------------------------------------------endl written by qz5zwangzihan1; const int MAXN300005; int n,q; bool ok[MAXN]; char c[MAXN]; int lst[MAXN]; char g; int dq; int main(){ ios::sync_with_stdio(false); cin.tie(NULL);cout.tie(NULL); cinnq; ga; fr1(i,1,n) lst[i]0; fr1(i,1,q){ int op; cinop; if(op1){ int x;cinx; if(!ok[x]){ ok[x]1; if(lst[x]dq){ c[x]g; } }else{ ok[x]0; lst[x]i; } }else{ char ccc; cinccc; gccc; dqi; } } string ans; fr1(i,1,n){ if(ok[i]){ ansc[i]; }else{ if(lst[i]dq){ ansg; }else{ ansc[i]; } } } coutans; RT 0; }