c语言无向指针,[C]C语言无指针treap!!

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

求看哪里错了,题目是noi2004郁闷的出纳员!衡阳八中1503!老是超时,目前发现size和它左右孩子的size和+它的weight不相等。。改了几天硬是改不出了!求神犇!求膜拜啊..救救我吧!看在无指针treap不容易的份上,fix 堆的权值weight重复节点value 你懂的fa 父亲,因为无指针所以旋转要用#include#include#includeint Q=0,n,minwork,num=1,root=1,you=0,fu=2,dota=0;struct treap{ int value,fix,size,left,right,weight,fa;}z[100005];void rotate_right(int p){ int i; if(p==root)root=z[p].left; if(z[z[p].fa].left==p) z[z[p].fa].left=z[p].left; else   z[z[p].fa].right=z[p].right;

z[z[p].left].fa=z[p].fa; i=z[z[p].left].right; z[z[p].left].right=p; z[p].fa=z[p].left; z[i].fa=p; z[p].left=i; z[p].size=z[z[p].left].size+z[z[p].right].size+z[p].weight; int j=z[p].fa; z[j].size=z[z[j].left].size+z[z[j].right].size+z[j].weight;}void rotate_left(int p){ int i; if(p==root)root=z[p].right; if(z[z[p].fa].left==p) z[z[p].fa].left=z[p].right; else   z[z[p].fa].right=z[p].right;     z[z[p].right].fa=z[p].fa; i=z[z[p].right].left; z[z[p].right].left=p; z[p].fa=z[p].right; z[i].fa=p; z[p].right=i; z[p].size=z[z[p].left].size+z[z[p].right].size+z[p].weight; int j=z[p].fa; z[j].size=z[z[j].left].size+z[z[j].right].size+z[j].weight;}void insert(int now,int v){ if(z[now].weight==0) { z[now].weight=1; z[now].size=1; z[now].value=v; z[now].fix=rand()+1; return; } if(v==z[now].value) { z[now].size++; z[now].weight++; return ; } else if(v=p){ you=now; return (find_houji(z[now].left,p)); } else return(find_houji(z[now].right,p));}int find_numk(int now,int k){ if(k>z[z[now].right].size&&k<=z[z[now].right].size+z[now].weight) return z[now].value; if(k<=z[z[now].right].size) return find_numk(z[now].right,k); else   return find_numk(z[now].left,k-z[z[now].right].size-z[now].weight);}int main(){ freopen("prime3.in","r",stdin); freopen("prime3.out","w",stdout); srand(time(0)); int i,j,k; int now1; char m[4]; scanf("%d%d%c",&n,&minwork,&m[3]); for(i=1;i<=n;i++) { scanf("%c%c%d%c",&m[0],&m[1],&k,&m[2]); switch (m[0]) {     case 'I': Q++; if(k

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值