HNOI2009 夢幻布丁 D1 T1

2021-08-14 23:39:18 字數 894 閱讀 2502

n個布丁擺成一行,進行m次操作.每次將某個顏色的布丁全部變成另一種顏色的,然後再詢問當前一共有多少段顏色.例如顏色分別為1,2,2,1的四個布丁一共有3段顏色.

第一行給出n,m表示布丁的個數和好友的操作次數. 第二行n個數a1,a2...an表示第i個布丁的顏色從第三行起有m行,對於每個操作,若第乙個數字是1表示要對顏色進行改變,其後的兩個整數x,y表示將所有顏色為x的變為y,x可能等於y. 若第乙個數字為2表示要進行詢問當前有多少段顏色,這時你應該輸出乙個整數. 0

針對第二類操作即詢問,依次輸出當前有多少段顏色.

4 31 2 2 121 2 12

310 < n, m < 100001

0 < ai, x, y < 106

hnoi2009

#includeint n,m,a[100001],f[1000001],s[1000001],k,c,d,ans,head[1000001],next[1000001],l[1000001];

void merge(int x,int y)

for(int i=head[x];i;i=next[i])

a[i]=y;

next[l[x]]=head[y];

head[y]=head[x];

s[y]+=s[x];

s[x]=0;

head[x]=0;

l[x]=0;

}int main()

for(int i=1;i<=m;i++)

if(s[f[c]]==0)

continue;

s[f[d]]+=s[f[c]];

s[f[c]]=0;

merge(f[c],f[d]);

} else

} }

HNOI2009 夢幻布丁

題意 n個布丁擺成一行,進行m次操作.每次將某個顏色的布丁全部變成另一種顏色的,然後再詢問當前一共有多少段顏色.例如顏色分別為1,2,2,1的四個布丁一共有3段顏色.對每個顏色的位置維護鍊錶。合併兩個顏色,連線鍊錶,統計貢獻。統計貢獻的複雜度是與鍊錶長度有關的。如果遍歷長度短的鍊錶那麼複雜度自然更小...

HNOI2009 夢幻布丁

n個布丁擺成一行,進行m次操作.每次將某個顏色的布丁全部變成另一種顏色的,然後再詢問當前一共有多少段顏色.例如顏色分別為1,2,2,1的四個布丁一共有3段顏色.輸入格式 第一行給出n,m表示布丁的個數和好友的操作次數.第二行n個數a1,a2.an表示第i個布丁的顏色從第三行起有m行,對於每個操作,若...

HNOI2009 夢幻布丁

題目鏈結 把每一種數字想象成乙個佇列。如果暴力合併,時間複雜度必然很高,考慮啟發式合併 每次把數字少的佇列合併到數字多的佇列上去。每次合併,若數字少的佇列數字個數為 s 則合併之後產生新佇列的大小必定不小於 2 s 時間複雜度 o n log n 這樣合併產生了乙個問題 即原來要求將 a 全部變為 ...