关于结构体内的指针

学术版

不会用typedef
by AlgoEmperor @ 2018-07-08 17:05:10


不是都用的数组吗,指针的话~~我猜~~是这么用 ``` struct tree { int data; tree *L,*R; }; tree[MAXN]; exist: tree[i];//当前节点 Lchild: tree[i].L->data;//访问左孩子 Rchild: tree[i].R->data;//访问右孩子 ```
by AlgoEmperor @ 2018-07-08 17:09:08


@[Ofnoname](/space/show?uid=73489) @[隔壁小邱](/space/show?uid=22539) 应该是tree->l->data
by moye到碗里来 @ 2018-07-08 17:27:12


我把我代码发出来吧。typedef与struct效果差不多的
by moye到碗里来 @ 2018-07-08 17:27:55


这个是finger_tree ``` #include<bits/stdc++.h> #define MAXN 300006 using namespace std; struct Node { int val,size; Node *ls,*rs; void pushup() { if(ls==NULL)return ; size = ls->size + rs->size; val = rs->val; } Node(int v,int s,Node *l,Node *r):val(v),size(s),ls(l),rs(r){} Node(){} }pool[MAXN]; int cnt = 0; Node *root = NULL; Node *NewNode(int val,int size,Node *ls,Node *rs) { pool[cnt] = Node(val,size,ls,rs); return &pool[cnt++]; } int find(int k,Node *rt) { if(rt->size == 1)return rt->val; if(k<=rt->ls->size)return find(k,rt->ls); else return find(k-rt->ls->size,rt->rs); } int Rank(int x,Node *rt) { if(rt->size == 1) { return 1; } else { if(x<=rt->ls->val){ return Rank(x,rt->ls); } else{ return Rank(x,rt->rs)+rt->ls->size; } } } inline void maintain(Node *rt) { if(rt->ls->size>rt->rs->size*4) { rt->rs = NewNode(rt->rs->val,rt->ls->rs->size+rt->rs->size,rt->ls->rs,rt->rs); Node *tmp = rt->ls;rt->ls = rt->ls->ls;*tmp = *rt->rs;rt->rs = tmp; cnt--; } else if(rt->ls->size*4<rt->rs->size) { rt->ls = NewNode(rt->rs->ls->val,rt->rs->ls->size+rt->ls->size,rt->ls,rt->rs->ls); Node *tmp = rt->rs;rt->rs = rt->rs->rs;*tmp = *rt->ls;rt->ls = tmp; cnt--; } } void ins(int val,Node *&rt) { if(rt == NULL){rt = NewNode(val,1,NULL,NULL);return ;} if(rt->size == 1) { rt->ls = NewNode(min(val,rt->val),1,NULL,NULL); rt->rs = NewNode(max(val,rt->val),1,NULL,NULL); } else { if(val>rt->ls->val)ins(val,rt->rs); else ins(val,rt->ls); } rt->pushup(); maintain(rt); } void del(Node *rt,Node *fa,int val) { if(rt->size == 1) *fa = fa->ls->val == val?*fa->rs:*fa->ls; else { if(val<=rt->ls->val)del(rt->ls,rt,val); else del(rt->rs,rt,val); } rt->pushup(); } int main() { int n; scanf("%d",&n); root = NewNode(2147483647,1,NULL,NULL); for(int i = 1; i <= n; i++) { int opt,x; scanf("%d %d",&opt,&x); if(opt == 1)ins(x,root); if(opt == 2)del(root,NULL,x); if(opt == 3)printf("%d\n",Rank(x,root)); if(opt == 4)printf("%d\n",find(x,root)); if(opt == 5)printf("%d\n",find(Rank(x,root)-1,root)); if(opt == 6)printf("%d\n",find(Rank(x+1,root),root)); } } ```
by moye到碗里来 @ 2018-07-08 17:28:55


谢谢!~~可能我这一辈子都用不上~~
by AlgoEmperor @ 2018-07-08 17:31:50


找不到平衡树了放个线段树的。。。。 ``` #include<bits/stdc++.h> using namespace std; typedef long long ll; ll n; struct data{ int x,y,h,f; bool operator < (const data p) const { if(h == p.h)return f < p.f; return h < p.h; } }l[5005*2]; ll ans = 0; inline ll abs(int a,int b){return a > b ? a - b : b - a;} struct node{ int l,r,len,num,lazy; node *ls,*rs; node(int a,int b,int c,int d,node *e,node *f,int l):l(a),r(b),len(c),num(d),ls(e),rs(f),lazy(l){} node(){} inline void pushup(){ if(lazy)return ; len = ls->len + rs->len; l = ls->l;r = rs->r; num = ls->num + rs->num; if(ls->r && rs->l)num--; } }pool[20005*2]; node *NewNode(int l,int r,int len,int num,node *ls,node *rs,int lazy){ static int cnt = 0; pool[cnt] = node(l,r,len,num,ls,rs,lazy); return &pool[cnt++]; } node *root; node *build(int l,int r){ node *rt = NewNode(0,0,0,0,NULL,NULL,0);int mid = (l + r) >> 1; if(l < r){ rt->ls = build(l,mid); rt->rs = build(mid+1,r); } return rt; } void add(node *rt,int l,int r,int L,int R){ if(L <= l && r <= R){ if(!rt->lazy){ rt->l = rt->r = 1; rt->len = r - l + 1; rt->num = 1; } rt->lazy += 1;return ; } int mid = (l + r) >> 1; if(mid >= L)add(rt->ls,l,mid,L,R); if(mid < R)add(rt->rs,mid+1,r,L,R); rt->pushup(); } void del(node *rt,int l,int r,int L,int R){ if(L <= l && r <= R){ rt->lazy--; if(!rt->lazy){ if(l == r){ rt->num = rt->len = rt->l = rt->r = 0; } else rt->pushup(); } return ; } int mid = (l + r) >> 1; if(mid >= L)del(rt->ls,l,mid,L,R); if(mid < R)del(rt->rs,mid+1,r,L,R); rt->pushup(); } int cnt2 = 0; int main() { scanf("%lld",&n); for(int i = 1; i <= n; i++){ int x,y,x1,y1; scanf("%d %d %d %d",&x,&y,&x1,&y1); l[++cnt2].x = x + 10000 + 1;l[cnt2].y = x1 + 10000 + 1;l[cnt2].h = y;l[cnt2].f = 0; l[++cnt2].x = x + 10000 + 1;l[cnt2].y = x1 + 10000 + 1;l[cnt2].h = y1;l[cnt2].f = 1; } sort(l + 1,l + 1 + cnt2); root = build(1,20005); int prelines=0,prelength=0; l[0].h = l[1].h; for(int i = 1; i <= cnt2; i++){ if(l[i].f == 0)add(root,1,20005,l[i].x,l[i].y-1); else del(root,1,20005,l[i].x,l[i].y-1); ans += prelines * 2 * (l[i].h - l[i-1].h); // if(root->num != prelines && (l[i].y - l[i].x + 1) == abs(prelength,root->len))ans--; prelines = root->num; ans += abs(root->len,prelength); prelength = root->len; } printf("%lld",ans); } 矩形周长。。 ```
by moye到碗里来 @ 2018-07-08 17:36:44


@[Ofnoname](/space/show?uid=73489) 不不不,这种方法是不用数组的,是直接从根节点访问,根节点的左右指针也是结构体类型
by SkyLiYu @ 2018-07-08 17:40:01


C++的Class了解一下:~~与struct并无太大区别~~ ```cpp #include<bits/stdc++.h> class Tree { public: char data; Tree *son[2]; }root,*now; int main() { root.son[0]=new Tree;//新增一个结点 root.son[0]->data='?';//变量名后用小数点,指针后用箭头:"->" root.son[0]->son[0]=new Tree;//皮一下 now=&root;//取地址 printf("%c",now->son[0]->data);//见输出 return 0; } ``` Output: ```cpp ? ```
by 吹雪吹雪吹 @ 2018-07-08 17:40:32


@[假装老船长](/space/show?uid=32831) 您这种方法怎么判断一个节点是不是空节点,求指教,谢谢
by SkyLiYu @ 2018-07-08 17:45:00


| 下一页