題目鏈結
題目大意:維護數列,茲瓷兩種操作: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行,對於每個操作,若第乙個數字...