思路
左偏树维护每个骑士的战斗力和加入的深度(因为只能向上跳)
注意做乘法的时候加法tag会受到影响代码
#include#include #include #define int long long using namespace std;struct Node{ int lson,rson,dis,num,mul,add,add_dep,sz,fa,id;}LT[300100];int n,m,u[300100<<1],v[300100<<1],fir[300100],nxt[300100<<1],cnt,fa[300100],S[300100],C[300100],A[300100],V[300100],H[300100],root[300100],ans_city[300100],ans_man[300100],dep[300100];int find(int x){ if(LT[x].fa==x) return x; else return LT[x].fa=find(LT[x].fa);}void pushup(int o){ LT[o].sz=LT[LT[o].lson].sz+LT[LT[o].rson].sz+1;}void pushdown(int o){ if(LT[o].mul!=1){ LT[LT[o].lson].num*=LT[o].mul; LT[LT[o].rson].num*=LT[o].mul; LT[LT[o].lson].mul*=LT[o].mul; LT[LT[o].rson].mul*=LT[o].mul; LT[LT[o].lson].add*=LT[o].mul; LT[LT[o].rson].add*=LT[o].mul; LT[o].mul=1; } if(LT[o].add){ LT[LT[o].lson].num+=LT[o].add; LT[LT[o].rson].num+=LT[o].add; LT[LT[o].lson].add+=LT[o].add; LT[LT[o].rson].add+=LT[o].add; LT[o].add=0; }}int merge(int x,int y){ if(x*y==0) return x+y; pushdown(x); pushdown(y); if(LT[x].num>LT[y].num) swap(x,y); LT[x].rson=merge(LT[x].rson,y); if(LT[LT[x].lson].dis =1&<[root[u]].num =1){ ans_man[LT[root[1]].id]=LT[root[1]].add_dep; root[1]=pop(root[1]); } for(int i=1;i<=n;i++){ printf("%lld\n",ans_city[i]); } for(int i=1;i<=m;i++) { printf("%lld\n",ans_man[i]); } return 0;}