P1177 【模板】快速排序 动态开点线段树题解
//动态开点线段树,指针版 #include<bits/stdc++.h> using namespace std; const int maxn=100010; typedef struct node{ int cnt; node* ls; node* rs; }node ; node* root=NULL; int cnt(node* rt) { if (rt) return rt->cnt; return 0; } void pushup(node *rt) { rt->cnt=cnt(rt->ls)+cnt(rt->rs); } void insert(node* &rt,int l,int r,int k) { if (rt==NULL) { rt=new node; rt->cnt=0; rt->ls=NULL; rt->rs=NULL; } if (l==r) { rt->cnt++; } else { int mid=l+(r-l)/2; if (k<=mid) { insert(rt->ls,l,mid,k); } else { insert(rt->rs,mid+1,r,k); } pushup(rt); } } void inorder(node* rt,int l,int r) { if (rt) { int mid=l+(r-l)/2; inorder(rt->ls,l,mid); if (rt->ls==NULL&&rt->rs==NULL) { for (int i=1;i<=rt->cnt;++i) cout<<l<<" "; } inorder(rt->rs,mid+1,r); } } int a[maxn]; int main() { int n; int L,R; scanf("%d",&n); scanf("%d",&a[1]); L=R=a[1]; for (int i=2;i<=n;i++) { scanf("%d",&a[i]); L=min(L,a[i]); R=max(R,a[i]); } for (int i=1;i<=n;i++) { insert(root,L,R,a[i]); } inorder(root,L,R); } /* 5 10 78 89 45 2 */