diff --git a/segtree.cpp b/segtree.cpp new file mode 100644 index 0000000..38b4af0 --- /dev/null +++ b/segtree.cpp @@ -0,0 +1,116 @@ +#include +using namespace std; +class Solution { +public: + struct tnode{ + int l,r; + int sum;//segment sum + int val;//segment max + }; + //vector a;//input + vector tree; + void buildtree(int no,int l,int r,vector &a){ + tree[no].l=l; + tree[no].r=r; + int mid=(l+r)/2; + if (l==r){ + //segment max + tree[no].val=a[l]; + //segment sum + //tree[no].sum=a[l]; + } + else{ + buildtree(no*2,l,mid,a); + buildtree(no*2+1,mid+1,r,a); + // segment max + tree[no].val=max(tree[no*2].val,tree[no*2+1].val); + // segment sum + //tree[no].sum=tree[no*2].sum+tree[no*2+1].sum; + } + return; + } + /* + //更新区间和 + void update0(int no,int lr, int val) { + if (tree[no].l==lr && tree[no].r==lr){ + tree[no].sum=val; + return; + } + + int mid=(tree[no].l+tree[no].r)/2; + if (lr>mid){ + update0(no*2+1,lr,val); + } + else{ + update0(no*2,lr,val); + } + tree[no].sum=tree[no*2].sum+tree[no*2+1].sum; + } + + void update(int index, int val) { + update0(1,index+1,val); + } + + //查找区间和 + int query(int no,int l, int r) { + if (tree[no].l==l && tree[no].r==r) + return tree[no].sum; + + int mid=(tree[no].l+tree[no].r)/2; + if (l>mid) + return query(no*2+1,l,r); + else if (r<=mid) + return query(no*2,l,r); + else + return query(no*2,l,mid)+query(no*2+1,mid+1,r); + } + */ + //查找区间大于v的最左侧位置 + int query(int no,int v, int pos,int l, int r) { + if (tree[no].val<=v) + return -1; + if (l==r) + return l; + + int mid=(l+r)/2; + if (pos<=mid){ + int res=query(no*2,v,pos,l,mid); + if (res>=0) + return res; + } + return query(no*2+1,v,pos,mid+1,r); + } + + vector leftmostBuildingQueries(vector& heights, vector>& queries) { + int n=heights.size(); + tree.resize(4*n+1); + buildtree(1,0,n-1,heights); + int qn=queries.size(); + vector res(qn); + for (int i=0;ib) swap(a,b); + if (a==b){ + res[i]=a; + }else if (heights[b]>heights[a]){ + res[i]=b; + }else{ + res[i]=query(1,heights[a],b+1,0,n-1); + } + } + return res; + } +}; +int main() +{ + Solution sol; + vector heights={3,1,2,4,5}; + vector> queries={{0,1},{1,0}}; + vector res=sol.leftmostBuildingQueries(heights,queries); + for (auto r:res){ + cout << r << " "; + } + cout << endl; + return 0; +}