首页 > 其他 > 详细

NOIP 考前 数据结构复习

时间:2016-11-10 02:51:19      阅读:303      评论:0      收藏:0      [点我收藏+]

BZOJ 1455 左偏树即可

技术分享
 1 #include <cstdio>
 2 #define LL long long
 3 const LL Maxn=1000100;
 4 struct Info{LL l,r,v,Dis;}Tree[Maxn];
 5 LL Father[Maxn],n,m,Dead[Maxn],u,v;
 6 inline void Swap(LL &x,LL &y){LL t=x;x=y;y=t;}
 7 LL Get(LL x) {return x==Father[x]?x:Father[x]=Get(Father[x]);}
 8 LL Merge(LL u,LL v)
 9 {
10     if (u==0 || v==0) return u+v;
11     if (Tree[u].v>Tree[v].v) Swap(u,v);
12     Tree[u].r=Merge(Tree[u].r,v);
13     if (Tree[Tree[u].l].Dis<Tree[Tree[u].r].Dis) 
14         Swap(Tree[u].l,Tree[u].r);
15     Tree[u].Dis=Tree[Tree[u].l].Dis+1;
16     return u;
17 }
18 int main()
19 {
20     scanf("%lld",&n);
21     for (LL i=1;i<=n;i++) scanf("%lld",&Tree[i].v),Tree[i].l=Tree[i].r=0;
22     for (LL i=1;i<=n;i++) Father[i]=i;
23     scanf("%lld",&m);
24     for (LL i=1;i<=m;i++)
25     {
26         char ch=getchar();
27         while (ch!=M && ch!=K) ch=getchar();
28         if (ch==M)
29         {
30             scanf("%lld%lld",&u,&v);
31             LL fu=Get(u);
32             LL fv=Get(v);
33             if (fu==fv || Dead[u] || Dead[v]) continue;
34             LL Tmp=Merge(fu,fv);
35             Father[fu]=Father[fv]=Tmp;
36         } 
37         if (ch==K)
38         {
39             scanf("%lld",&u);
40             if (Dead[u]) {puts("0"); continue;}
41             LL fu=Get(u); Dead[fu]=true;
42             printf("%lld\n",Tree[fu].v);
43             LL Tmp=Merge(Tree[fu].l,Tree[fu].r);
44             Father[fu]=Tmp;
45             Father[Tmp]=Tmp;
46         }
47     }
48     return 0;
49 }
BZOJ 1455

 

NOIP 考前 数据结构复习

原文:http://www.cnblogs.com/yyjxx2010xyu/p/6049393.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!