國家集訓隊 數顏色

2022-07-22 05:21:14 字數 1329 閱讀 5499

墨墨購買了一套n支彩色畫筆(其中有些顏色可能相同),擺成一排,你需要回答墨墨的提問。墨墨會向你發布如下指令:

1、 q l r代表詢問你從第l支畫筆到第r支畫筆中共有幾種不同顏色的畫筆。

2、 r p col 把第p支畫筆替換為顏色col。

題解:做這道題之前不會帶修改莫隊,山神學會了之後手(嘴)把手(嘴)教我打**。

莫隊演算法先放下,帶修改莫隊是醬的:記下所有的修改,同時為每個詢問加入乙個時間標記,表示這個詢問發生時修改到了哪一步。求解之前記錄乙個時間戳。每次求解乙個詢問時,先按普通莫隊求解,然後檢視當前時間戳和這個詢問的標記,不一樣的話就乙個時間乙個時間地改過去,同時修改答案。進行時間修改時,比如這道題,swap了修改的顏色和修改前的顏色,這樣可以讓之後發生時間倒流。

**:

#include#include

#include

#include

#define mxn 10000+1

#define mxc 1000000+1

struct queryq[mxn];

struct changec[mxn];

intblock[mxn];

bool

cmp(query a,query b)

else

return block[a.l]

}int

n,m,x,y;

intqsum,csum;

std::

string

p;int

color[mxn];

intman[mxc];

intans[mxn];

void change(int t,int i,int &temp)

std::swap(color[c[t].p],c[t].co);

return;}

intmain()

while(m--)

if(p[0]=='r'

) }

std::sort(q,q+qsum,cmp);

int l=0,r=0,t=0,temp=0

;

for(int i=0;i)

while(l>q[i].l)

while(rif(man[color[r]]==1) temp++;}

while(r>q[i].r)

while(t;change(t,i,temp);}

while(t>q[i].t)

ans[q[i].id]=temp;

}for(int i=0;i"

%d\n

",ans[i]);

return0;

}

**ps:壓行嚴重。

國家集訓隊 數顏色

點此看題 正解應該是帶修莫隊,我們這裡講一下樹套樹的做法。本題主要涉及的問題是去重,我們定義nxt i nxt i nxt i 為最靠近i ii位置後面顏色和i ii相同的位置,統計 l,r l,r l,r 裡面不同顏色的個數即統計 i lrnx t i r sum nxt i r i lr nxt...

數顏色 國家集訓隊

待修莫隊模板題 待修莫隊在普通莫隊的基礎上,額外維護乙個修改操作,每一次根據查詢操作的時間加入修改或是撤銷修改。實現蠻顯然的,配合 很容易搞懂。note 塊大小的證明參見這裡,此處不做贅述。include using namespace std namespace standardio templa...

國家集訓隊 數顏色

題目 洛谷p1903 bzoj2120。題目大意 給你一列數,有兩種操作 1.詢問區間 l,r 內不同數出現的個數。2.單點修改。解題思路 帶修莫隊。仍然運用分塊思路,加了乙個修改時間而已。所以以 l 所在的塊為第一關鍵字,r 所在的塊為第二關鍵字,修改時間為第三關鍵字排序即可。c code inc...