题目目录:1011 1007 1004
1011题 Segment Tree with Pruning(带修建的分段树)
题目大意:给出n和k,要求在区间【1,n】上建左右子树,当左右子树的区间长度小于k时则停止建树(剪枝),输出总的结点个数。
思路:由于建树的最终结点个数只和区间长度有关,而与左右端点无关,用左右分支的区间长度来求其中的结点个数再加上根结点,并且用map保存出现过的区间长度对应的结点个数,这样会大大降低时间复杂度。
#include <bits/stdc++.h> using namespace std; typedef long long ll; ll n,k; map<ll,ll> mp;//由ll类型映射到ll类型,通过下标访问 ll build(ll r){//区间长度一样的情况下,其实画出的树也是一样的 if(mp.find(r)!=mp.end()) return mp[r]; if(r<=k) return mp[r]=1; return mp[r]=build(r/2)+build(r-r/2)+1;//自己加上左右树的结点个数 } int main(){ std::ios::sync_with_stdio(false); int t; cin>>t; while(t--){ cin>>n>>k; mp.clear(); cout<<build(n)<<endl; } return 0; }
1007题 Photoshop Layers(Photoshop图层)
题目大意:
思路: