洛谷3261,可並堆打標記

2021-08-03 08:30:36 字數 1627 閱讀 7601

這題網上題解到處都是。

但有乙個關鍵處

void dfs(int

x,int fa)

while(r[x] && a[r[x]].vx])

if(aa[x] && r[x])cov(r[x],vv[x],0);

else cov(r[x],1,vv[x]);

}

void dfs(int

x,int fa)

r[x]=merge(r[x],r[y]);

}if(aa[x] && r[x])cov(r[x],vv[x],0);

else cov(r[x],1,vv[x]);

}

這兩份**那個對哪個錯?答案是第乙個對。因為第二個會讓葉子結點的騎士活下來(鳴謝ww140142)

#pra\

gma gcc optimize("o2")

#include

using

namespace

std;

typedef

long

long ll;

const

int maxn=1000005;

int xb,r[maxn],h[maxn],n,m,i,c[maxn],ans1[maxn],ans2[maxn],dep[maxn],aa[maxn],y;

ll hh[maxn],vv[maxn],s[maxn],x;

struct node

bool

operator>(const node&rhs)

bool

operator

<(const node&rhs)

void pushdown(int i)

int merge(int x,int y)

struct edge

}e[maxn];

void addedge(int x,int y)

void pop(int&x)

void dfs(int x,int fa)

while(r[x] && a[r[x]].vif(aa[x] && r[x])cov(r[x],vv[x],0);

else cov(r[x],1,vv[x]);

}inline

int getint()

for(;isdigit(c);c=getchar())x=x*10+c-48;

return x*y;

}inline ll getl()

for(;isdigit(c);c=getchar())x=x*10+c-48;

return x*y;

}int buf[100];

inline

void putint(int x)

}int main()

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

dfs(1,0);

while(r[1])

for(i=1;i<=n;++i)putint(ans1[i]),putchar('\n');

for(i=1;i<=m;++i)putint(ans2[i]),putchar('\n');

return

0;}

洛谷 3377 模板 左偏樹(可並堆)

題目傳送門 作為乙個合格的蒟蒻,我們當然在學每一種演算法後都要去做一些和這種演算法有關的模板題。毫無疑問,這是一道左偏樹的模板題。伏地膜大佬,這位大佬對左偏樹的解釋十分到位。左偏樹就是在堆的基礎上加上了距離的概念。距離指的是每乙個節點到離他最近的不滿節點的距離。若乙個節點的左兒子或右兒子為空,則該節...

洛谷P3377 模板 左偏樹(可並堆)

題目描述 如題,一開始有n個小根堆,每個堆包含且僅包含乙個數。接下來需要支援兩種操作 操作1 1 x y 將第x個數和第y個數所在的小根堆合併 若第x或第y個數已經被刪除或第x和第y個數在用乙個堆內,則無視此操作 操作2 2 x 輸出第x個數所在的堆最小數,並將其刪除 若第x個數已經被刪除,則輸出 ...

洛谷 P3377 模板 左偏樹(可並堆)

有 n nn 個小根堆,每個堆只有乙個數,進行兩種操作 1 x y將第 x,y x,yx,y 個數分別在的小根堆合併 2 x輸出第 x xx 個數所在的的堆的最小數,並將其刪除,有多個則刪除最先輸入的,若第 x xx 個數已刪除,則輸出 1 1 1思路 左偏樹 include include def...