题解 CF1515I【Phoenix and Diamonds】
CF1515I Phoenix and Diamonds解题报告:
更好的阅读体验
似乎是你谷首杀,针不戳。
题意
分析
神奇的题目,感觉没有CF*3400评分这么夸张,不过这数据确实强。
由于钻石种类已经给定,因此我们可以知道拿钻石的优先级。
发现处理询问的复杂度与
设
自然而然地设
状态是
查询部分,我们就先判掉叶子结点的情况,然后考虑重钻石与轻钻石都可以取走的情况,然后再判一判是不是只能取轻钻石,如果都不是的话就递归两个儿子处理。
记得动态维护当前
时间复杂度:
long long query(int l,int r,int now){//calc()是维护c的最高位ω的函数
if(l==r){
long long num=min(a[id[l]],c/w[id[l]]);
c-=num*w[id[l]],calc();
return num*v[id[l]];
}
if(lightw[now][omega]<=c){
long long res=lightv[now][omega];
c-=lightw[now][omega],calc();
return res;
}
if(lightw[now][omega-1]<=c&&c<extra[now][omega-1]){
long long res=lightv[now][omega-1];
c-=lightw[now][omega-1],calc();
return res;
}
int mid=(l+r)>>1;
return query(l,mid,lc[now])+query(mid+1,r,rc[now]);
}
AC记录&代码