1 条题解
-
0
C++ :
#include <iostream> #include <cstdio> #define N 502 #define M 300002 using namespace std; char op[10]; int n,m,k,i,val[M],son[M][2],dis[M],fa[M],r[N]; int merge(int x,int y) { if(!x) return y; if(!y) return x; if(val[x]>val[y]) swap(x,y); son[x][1]=merge(son[x][1],y); if(dis[son[x][0]]<dis[son[x][1]]) swap(son[x][0],son[x][1]); fa[son[x][0]]=fa[son[x][1]]=x; dis[x]=dis[son[x][1]]+1; return x; } void add(int x,int y,int z) { int f=fa[y],tmp=merge(son[y][0],son[y][1]); if(r[x]==y) r[x]=tmp; else if(son[f][0]==y) son[f][0]=tmp; else son[f][1]=tmp; fa[tmp]=f; fa[y]=son[y][0]=son[y][1]=0; val[y]+=z; r[x]=merge(r[x],y); } int main() { scanf("%d %d %d",&n,&m,&k); for(i=1;i<=k;i++){ int x,y,z; scanf("%s",op); if(op[0]=='A'){ scanf("%d %d %d",&x,&y,&z); val[y]=z; r[x]=merge(r[x],y); } else if(op[0]=='D'){ scanf("%d %d %d",&x,&y,&z); add(x,y,-z); } else if(op[0]=='T'){ scanf("%d %d",&x,&y); r[y]=merge(r[x],r[y]); r[x]=0; } else if(op[0]=='M'){ scanf("%d",&x); printf("%d\n",val[r[x]]); } else{ scanf("%d %d",&x,&y); if((son[r[x]][0]&&val[r[x]]==val[son[r[x]][0]])||(son[r[x]][1]&&val[r[x]]==val[son[r[x]][1]])) puts("ERROR"); else add(x,r[x],y); } } return 0; }
- 1
信息
- ID
- 1815
- 时间
- 1000ms
- 内存
- 16MiB
- 难度
- (无)
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者