一直想學這個演算法,但是沒有碰見類似的於是就作罷
今天忽然看到這道題有點感覺,搞一搞
感覺帶修莫隊其實不是特別深奧難懂的
只是在原有的基礎上加了乙個時間軸
我比較喜歡在struct裡面寫過載
structmo
return l}
} q[n];
這樣就排好序了,大致的也沒啥,直接上**看看就很容易懂的哦
#includeusingnamespace
std;
const
int n=1e6+7
;int
m,n,k,size,res,qnum,cnum,inc;
intcnt[n],ans[n],a[n];
struct
mo
return l}
} q[n];
struct
change
c[n];
void change(int now,int
t) swap(a[c[now].pos],c[now].val);
}int
main()
else
}sort(q+1,q+qnum+1
);
int l=0,r=0,now=0
;
for (int i=1;i<=qnum;i++)
while (lif (cnt[a[l]]==0) inc--;l++;}
while (r>q[i].r)
while (rif (cnt[a[r]]==0) inc++;cnt[a[r]]++;}
while (now>q[i].t)
while (now;change(now,i);}
ans[q[i].id]=inc;
}for (int i=1;i<=qnum;i++) printf("
%d\n
",ans[i]);
return0;
}
國家集訓隊 數顏色 維護佇列(帶修莫隊)
題意 對給定的序列,回答m個詢問,q 詢問l到r中不同的顏色數量,r 將下標為x的顏色改為y 題解 帶修莫隊,相對普通的莫隊,加多了乙個關鍵字排序 include define num ch 0 define pn putchar n using namespace std templatevoid...
數顏色(莫隊帶修)
數顏色題目鏈結 帶修改的莫隊,關於時間複雜度的分析沒仔細看,但是這是乙個能實現更改的離線操作,感覺在之前的維度上加了一維 時間維度,可以將狀態向前或者向後改變,而時間的變遷也用while來更新,以達到操作目的,sort規則也變成這樣 return qu a.l qu b.l qu a.r qu b....
帶修莫隊 數顏色
bzoj2120 帶修莫隊的做法 把所有修改也離線下來 新建乙個tk指標表示進行了k次修改,然後對於每個詢問記錄一下它之前有多少次修改,記為k,處理這個詢問時如果當前修改次數小於k,那麼就把tk往上滾,並進行修改,如果大於k,就把tk往下滾,並回溯修改 code include using name...