第六个测试点是啥?

P5076 【深基16.例7】普通二叉树(简化版)

不是你不给代码看什么?
by _QrSn_ @ 2023-12-26 12:10:56


**代码如下:** ```cpp #include<bits/stdc++.h> using namespace std; const int N=1e4+3,INF=2147483647; struct TREE{ int val,ls,rs,cnt,siz; }tr[N]; //val为当前节点的值,ls,rs为左右指针 //cnt为当前节点出现的次数,siz为当前子树节点树 int tn; void add(int r,int v){ tr[r].siz++; //该节点大小增大 if(tr[r].val==v){ //找到相同值 tr[r].cnt++; return; } if(v<tr[r].val){ //往左子树加 if(tr[r].ls==0){ ++tn; tr[r].ls=tn; tr[tn].val=v; tr[tn].cnt=tr[tn].siz=1; } else{ add(tr[r].ls,v); } } else{//往右子树加 if(tr[r].rs==0){ ++tn; tr[r].rs=tn; tr[tn].val=v; tr[tn].cnt=tr[tn].siz=1; } else add(tr[r].rs,v); } } int findFr(int r,int x,int ans){ //ans为已经查到的最大前驱值 if(tr[r].val>=x){ //到左子树找前驱 if(tr[r].ls==0) return ans; else return findFr(tr[r].ls,x,ans); } else{ //当前节点值小于x,当前子树都是x的前驱 if(tr[r].rs==0) //没有右节点,没有更大前驱了 return tr[r].val; else return findFr(tr[r].rs,x,tr[r].val);//前驱值也更新 } } int findNx(int r,int x,int ans){ //ans为已经查到的最大前驱值 if(tr[r].val<=x){ //到右子树找后继 if(tr[r].rs==0) //没有右子节点返回 return ans; else return findNx(tr[r].rs,x,ans); } else{ //当前节点值大于x,当前子树都是x的后继 if(tr[r].ls==0) //没有左节点,没有更小后继了 return tr[r].val; else return findNx(tr[r].ls,x,tr[r].val);//前后继也更新 } } int findVal(int r,int x){ if (r==0) return 0; if(tr[r].val==x) return tr[tr[r].ls].siz; if(tr[r].val>x) return findVal(tr[r].ls,x); return findVal(tr[r].rs,x)+tr[tr[r].ls].siz+tr[r].cnt; } int findRk(int r,int x){ if(r==0) return INF; if(tr[tr[r].ls].siz>=x) return findRk(tr[r].ls,x); if(tr[r].cnt+tr[tr[r].ls].siz>=x) return tr[r].val; return findRk(tr[r].rs,x-tr[r].cnt-tr[tr[r].ls].siz); //去掉根和左子树排名,再在右子树按新排名找 } int main() { int q,op,x; scanf("%d",&q); while(q--){ scanf("%d%d",&op,&x); switch(op){ case 1: printf("%d\n",findVal(1,x)+1); break; case 2: printf("%d\n",findRk(1,x)); break; case 3: printf("%d\n",findFr(1,x,-INF)); break; case 4: printf("%d\n",findNx(1,x,INF)); break; case 5: if(tn==0){ ++tn; tr[tn].val=x; tr[tn].cnt=tr[tn].siz=1; } else add(1,x); break; } } return 0; } ```
by youyukyc @ 2023-12-26 12:11:44


@[_QrSn_](/user/511253) 代码在下面
by youyukyc @ 2023-12-26 20:12:29


@[_QrSn_](/user/511253) 谢谢,代码贴在下面了的
by youyukyc @ 2023-12-26 20:13:29


@[youyukyc](/user/135799) 第六个点是某个毒瘤添加的hack,是在没有insert的时候查询pre与next,所以会re。
by litjohn @ 2024-02-06 19:06:21


|