1483 HNOI2009 夢幻布丁

2021-08-04 06:36:54 字數 1093 閱讀 6437

題目鏈結

題目大意:維護數列,茲瓷兩種操作:1.把所有x變成y

2.詢問數列中的連續段數,相鄰且相同的為一段

題解:先求一下初始的答案,記作ans,然後維護它

由於沒有資料範圍,考慮用平衡樹啟發式合併暴力

用若干個鍊錶維護,乙個鍊錶維護一種顏色出現的各個位置

操作1:啟發式合併鍊錶,同時維護答案為了

方便在啟

髮式合併

時因為s

ize而

交換鍊錶

,記錄p

[i]表

示顏色i

所代表的

實際顏色

,初始p

[i]=

i,交換

p[x]

,p[y

]即可

操作2:輸出ans……

這裡的多個鍊錶使用前向星實現……

我終於會鍊錶了

我的收穫:求初始答案然後維護似乎挺常見的

#include 

#include

#include

#include

using

namespace

std;

#define m 1000100

int n,q,z,ans,t;

int c[m],sz[m],head[m],p[m];

struct edgee[m<<1];

void add(int u,int v);head[u]=t++;}

void merge(int x,int y)

for(int i=head[x];i!=-1;i=e[i].nex) c[e[i].to]=y;//修改

for(z=head[x];e[z].nex!=-1;z=e[z].nex);//找到鍊錶x

e[z].nex=head[y];head[y]=head[x];head[x]=-1;//因為鍊錶不需要考慮單調性,直接把鍊錶y連到鍊錶x後面

sz[y]+=sz[x];sz[x]=0;

}void work()

}void init()

}int main()

BZOJ1483 HNOI2009 夢幻布丁

因為是把所有顏色x都變成顏色y,所以把顏色y變成顏色x也是可以的 那麼每次呢,就是要把兩種顏色合併 記錄一下每個顏色當前存在哪個煉表裡,啟發式合併鍊錶就好了 include include include include include include include include include...

bzoj 1483 HNOI2009 夢幻布丁

題目大意 可以把一種顏色完全染為另一種顏色,問顏色段數。我用了線段樹合併。對每種顏色開一棵線段樹每一段記下左邊和右邊是否有這種顏色,就可以維護了。然而無限re,拍又拍不出。留坑。難道要離散化?可是std也沒有啊?向大神求助。include include include includeusing n...

BZOJ1483 HNOI2009 夢幻布丁

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