XSY1986 BZOJ1455 羅馬遊戲

2022-05-22 20:39:12 字數 722 閱讀 5457

就是一模板題。

合併就直接merge。

pop就是將自己的值設為一,再將自己的左右兒子合併即可。

查詢直接找到堆頂,輸出。

模板左偏樹

**:

#includeusing namespace std;

int dis[1000001],ch[1000001][2],fa[1000001],n,m,x,y,xx,yy,val[1000001];

char op[2];

int merge(int x,int y)

if(val[x]>val[y]||(val[x]==val[y]&&x>y))

ch[x][1]=merge(ch[x][1],y);

if(dis[ch[x][0]]fa[x]=fa[ch[x][0]]=fa[ch[x][1]]=x;

dis[x]=dis[ch[x][1]]+1;

return x;

}int getfa(int x)

return x;

}void pop(int x)

int main()

scanf("%d",&m);

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

xx=getfa(x);

yy=getfa(y);

if(xx!=yy)

}elseelse

} }return 0;

}

bzoj 1455 羅馬遊戲

link 羅馬遊戲 這道題 每次合併兩個集合 或者 每次找到某個集合中值最小的並且將其刪掉。發現直接主席樹 主席樹合併即可 但是這樣做過於不優美且 n leq 1000000 這樣做在常數上不優秀。我們考慮開堆 合併兩個堆?啟發式合併?nlog 2崩掉。那直接開斜堆 即左偏樹 或者說可並堆。這樣合併...

bzoj1455羅馬遊戲

bzoj1455羅馬遊戲 題意 維護資料結構支援合併和彈出最小值。n 1000000,m 100000 題解 可並堆,注意本題合併時要判斷兩個節點是否在同乙個堆中。本弱寫了左偏樹和斜堆,發現斜堆比左偏樹快,不知道為什麼,求神犇解答。1 include 2 include 3 include 4 de...

bzoj1455 羅馬遊戲

time limit 5 sec memory limit 64 mb submit 1526 solved 639 submit status discuss 第一行乙個整數n 1 n 1000000 n表示士兵數,m表示總命令數。第二行n個整數,其中第i個數表示編號為i的士兵的分數。分數都是 0...