【算法】可并堆(左偏树)
#include#include using namespace std;const int maxn=1000010;int l[maxn],r[maxn],fa[maxn],d[maxn],a[maxn],n,m;bool die[maxn];//0生1死int find(int x){ return fa[x]==x?x:fa[x]=find(fa[x]);}int merge(int x,int y)//返回x和y合并后子树的根{ if(!x)return y; if(!y)return x;//遇到一边为空节点则把另一边剩余的子树整颗接上去(返回) if(a[x]>a[y])swap(x,y);//将根节点更小的树放在左边 r[x]=merge(r[x],y);//递归合并左树右孩子和右树 if(d[l[x]]
另有蒟蒻WA的代码,错误已标注。
WA Code >_<