POJ2182 线段树维护区间可用值
题意 给你n 下面n - 1个数表示从第2个到第n个——第i个cow前面有多少只编号比它小的cows 问你这n只cows的排列。 思路 线段树维护区间可以用的编号有几个。 从后先前枚举 ans[i]是每次前面有a[i]个可用的答案 找到这一位的答案后 删除已经使用的编号更新线段树 Accode #include<cstdio> #include<iostream> #include<algorithm> using namespace std; const int MaxN = 8e4 + 5; const int inf = 0x3f3f3f3f; int n; int a[MaxN],ans[MaxN]; struct NODE{ int l,r,w; }tree[MaxN]; void build(int k,int ll,int rr){ tree[k].l = ll; tree[k].r = rr; tree[k].w = rr - ll + 1; if(ll == rr){ return ; } int m = (ll + rr) / 2; build(2 * k,ll,m); build(2 * k + 1,m + 1,rr); } int ask_p(int k,int x){ if(tree[k].l == tree[k].r){ return tree[k].l