墨墨購買了一套n支彩色畫筆(其中有些顏色可能相同),擺成一排,你需要回答墨墨的提問。墨墨會向你發布如下指令:
1、 q l r代表詢問你從第l支畫筆到第r支畫筆中共有幾種不同顏色的畫筆。
2、 r p col 把第p支畫筆替換為顏色col。
題解:做這道題之前不會帶修改莫隊,山神學會了之後手(嘴)把手(嘴)教我打**。
莫隊演算法先放下,帶修改莫隊是醬的:記下所有的修改,同時為每個詢問加入乙個時間標記,表示這個詢問發生時修改到了哪一步。求解之前記錄乙個時間戳。每次求解乙個詢問時,先按普通莫隊求解,然後檢視當前時間戳和這個詢問的標記,不一樣的話就乙個時間乙個時間地改過去,同時修改答案。進行時間修改時,比如這道題,swap了修改的顏色和修改前的顏色,這樣可以讓之後發生時間倒流。
**:
#include#include**ps:壓行嚴重。#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;
}
國家集訓隊 數顏色
點此看題 正解應該是帶修莫隊,我們這裡講一下樹套樹的做法。本題主要涉及的問題是去重,我們定義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...