codeforces 932D Tree 倍增法+二分搜索

题面叙述

题目给出两种操作:
操作1是将一个权重为W的点加到树的某个节点下。
操作2是询问一个从R开始的序列的最长可能长度。
其中这个序列要这样找:从R开始,沿着祖先方向往上找,凡是权重大于等于当前序列最后一个点的要被选上,然后更新序列。权重和要最大且小于X。

题解

我们设定一个数组nxt[i]表示i的祖先中,第一个权重大于等于i的权重的节点。再定义一个数组sum[i]表示从i出发,一直往上走所形成的满足题意序列的权重和,我们可以认为sum[i]是一个前缀和。
下面我们的关键是怎么来维护nxt数组和sum数组,如果新来一个R节点,把它放在U节点下面的话,怎么找到这条链上第一个权重大于等于R的权重的节点成了问题。
我们最直接想到的方法是暴力,一个一个往上枚举,但是这样复杂的显然会爆炸。所以我们用倍增的思想。即nxt[i][j]表示从i节点出发的满足题意的序列中距离i为2j2j的点的编号。
那么我们可以用二分搜索的方式快速的找到这条链上第一个权重大于等于R的权重的节点。时间复杂度O((logn)2)O((logn)2)
然后就得到了nxt[R][0],nxt[R][i]=upstep(nxt[R][0],2i1)nxt[R][i]=upstep(nxt[R][0],2i−1)
其中upstep(u,s)表示由u开始,往上走s步到达的节点。
回答询问也很简单,同样适用二分答案的方式,二分序列的长度,
找到满足sum[R]sum[upstep(R,s)]<=Xsum[R]−sum[upstep(R,s)]<=X最大的s,s就是答案。时间复杂度同样是O((logn)2)O((logn)2)


代码

#include <cstdio>
#include <iostream>
typedef long long ll;
const int maxn = 400007;
const ll inf = 1e18;
ll ws[maxn],sum[maxn],nxt[maxn][25],dep[maxn],p,q,Q,tp,last,cnt = 1;
int upstep(int rt,int step){int i = 0;int ans = rt;while(step){if(step&1) ans = nxt[ans][i];step >>= 1;i++;}return ans;
}
void op1(){ll R = last ^ p,W = last ^ q,U = ++cnt;ws[U] = W;if(ws[R] >= ws[U]) nxt[U][0] = R;else{ll l = 1,r = (cnt+1),mid,tar;while(r-l>1){mid = (l+r)/2;tar = upstep(R,mid);if(ws[tar] >= ws[U]) r = mid;else l = mid;}tar = upstep(R,l);if(ws[tar] >= ws[U]) nxt[U][0] = tar;else nxt[U][0] = nxt[tar][0];}sum[U] = sum[nxt[U][0]] + W;dep[U] = dep[nxt[U][0]] + 1;for(int i = 1;i < 21;++i) nxt[U][i] = upstep(nxt[U][0],(1<<i)-1);//printf("%lld\n",nxt[U][0]);
}
void op2(){ll R = last ^ p,X = last ^ q;if(X < ws[R]){printf("%lld\n",last = 0);return ;}ll l = 1,r = dep[R]+1,mid,tar,sm;while(r-l>1){mid = (l+r)/2;tar = upstep(R,mid);sm = sum[R] - sum[tar];//printf("sm = %lld,tar = %lld,mid = %lld\n",sm,tar,mid);if(sm > X) r = mid;else l = mid;//printf("l = %lld,r = %lld\n",l,r);}tar = upstep(R,l);printf("%lld\n",last = l);
}
int main(){dep[1] = 1;ws[0] = inf;scanf("%lld",&Q);while(Q--){scanf("%lld%lld%lld",&tp,&p,&q);if(tp == 1) op1();else op2();}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/321326.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

P4430-小猴打架【perfer序列】

正题 题目链接:https://www.luogu.com.cn/problem/P4430 题目大意 nnn个点&#xff0c;每次不同联通块之间连边直到成为一颗树&#xff0c;求连边方式 解题思路 根据perferperferperfer序列&#xff0c;可以将一颗无根树变为一个长度n−2n-2n−2的序列&#xff0c;所以数量是…

【DP】小明在边塞(jzoj 2147)

小明在边塞 题目大意&#xff1a; 小明在&#xff08;1,1&#xff09;&#xff0c;他要去到&#xff08;n,m&#xff09;&#xff0c;当此点为1时&#xff0c;他的体力值-1&#xff0c;当此点为2时&#xff0c;他的体力值1&#xff0c;他只会向下或向右走&#xff08;就是往终…

使用ML.NET实现情感分析[新手篇]

在发出《.NET Core玩转机器学习》和《使用ML.NET预测纽约出租车费》两文后&#xff0c;相信读者朋友们即使在不明就里的情况下&#xff0c;也能按照内容顺利跑完代码运行出结果&#xff0c;对使用.NET Core和ML.NET&#xff0c;以及机器学习的效果有了初步感知。得到这些体验后…

codeforces 932E Team Work 高等数学求导、dp

题解 这是一道纯粹的数学求导题目。 首先我们先写出要求的公式。 ans∑r1nCnrrkans \sum_{r1}^{n} C_n^{r}r^kans∑r1n​Cnr​rk 乍一看&#xff0c;雾草好吓人&#xff0c;但是学过高等数学且稍有常识的人&#xff08;不是我&#xff09;可以看出&#xff0c;这个可以由某个…

【背包】小明逛超市(jzoj 2148)

小明逛超市 题目大意&#xff1a; 有一个大小为n的背包&#xff0c;和m件物品&#xff0c;每件物品都有自己的价格和价值还有个数&#xff0c;当个数为0时则为无限件&#xff0c;为1实则为1件&#xff0c;求最大的价值 样例输入 4 5 5 3 0 5 3 1 4 4 0 2 3 0 3 2 1 样…

P4093-[HEOI2016/TJOI2016]序列【CDQ分治,树状数组】

正题 题目链接:https://www.luogu.com.cn/problem/P4093 题目大意 nnn个数字&#xff0c;每次有一个数字可能和原序列不同&#xff0c;但最多只有一个不同。 求所有情况下都满足的最长不降子序列 解题思路 定义maximax_imaxi​表示位置iii的最大数&#xff0c;minimin_imini…

潘正磊:再过三五年 AI会变成开发人员的基本概念

在微软Build 2018开发者大会上&#xff0c;微软公司全球开发平台事业部的资深副总裁潘正磊&#xff08;Julia Liuson&#xff09;接受了界面记者在内的采访。潘正磊在微软西雅图总部带领一千多人组成的团队&#xff0c;微软的开发工具&#xff0c;包括Visual Studio&#xff0c…

codeforces 938D Buy a Ticket 有初值的Dijkstra、有趣的题目

题意 给出一些城市电影票的价格&#xff0c;以及城市之间交通的路费&#xff0c;询问每一个城市怎样才能花最少的钱看到电影&#xff08;看完电影还要再回来&#xff09;。 题解 这是一道不太难但是挺有趣的题目。 我们这样想&#xff0c;每个城市只需要查看票价比他更便宜的城…

P2480-[SDOI2010]古代猪文【中国剩余定理,Lucas定理】

大早上起来写题有助于醒脑&#xff08;其实是昨晚没睡好/kk 正题 题目链接:https://www.luogu.com.cn/problem/P2480 题目大意 给出nnn和ggg&#xff0c;求g∑d∣nCnd%999911659g^{\sum_{d|n}C_{n}^d}\% 999911659g∑d∣n​Cnd​%999911659 解题思路 因为999911659999911659…

qMISPlat入门级使用问题解答一

qMISPlat 2.0(业务配置开发平台) 自2018-4-18号正式开源以来&#xff0c;得到了众多.net core爱好者的关注&#xff0c;现将近半个月以来&#xff0c;大家反馈的一些使用配置方面的问题统一作如下解答。如你对qMISPlat不了解&#xff0c;请查看文章qMISPlat产品介绍。一、从码云…

【DP】小明游天界(zjoj 2149)

小明游天界 题目大意&#xff1a; 有 m个单位时间&#xff0c;让你从1走到n&#xff08;不能早到&#xff0c;不能晚到&#xff09;&#xff0c;要使经过的城市最多&#xff0c;若无法用m个单位时间到达n就输出-1 样例输入 5 12 4 1 2 5 1 4 3 4 2 4 2 5 5 样例输出 …

codeforces 935E Fafa and Ancient Mathematics 语法树、动态规划

题解 一道很有意思的题目&#xff0c;同时把动态规划和语法树结合起来&#xff0c;很有新意&#xff0c;思路我是想出来了&#xff0c;但是我的写法较为麻烦&#xff0c;从别人的submission中找了一个写起来简介的代码分享给大家。 看到表达式的形式&#xff0c;我们可以想到使…

P1429-平面最近点对(加强版)【分治】

正题 题目链接:https://www.luogu.com.cn/problem/P1429 题目大意 平面上nnn个点&#xff0c;求最近点对 解题思路 考虑分治求最近点对&#xff0c;首先将平行于yyy轴将平面穿过xxx左边的中位数分割成两半&#xff0c;现在最近点对有三种可能&#xff0c; 在分割线左边在分…

夏季(8 ~9)月 在深圳举办线下dotnet 大会 调查

随着微软 Build 2018的落幕&#xff0c;微软为.NET Core的应用规划了七大场景&#xff1a;计划今年夏季&#xff08;8 ~9&#xff09;月 在深圳举办线下dotnet 大会 &#xff0c;特此向大家做个调查。请大家抽出5分钟做下投票&#xff1a;顺便送大家一个福利&#xff1a;.NET社…

2019.01.22【NOIP普及组】模拟赛C组总结

总结 这次模拟赛拿到了10010010060360的分数 第1,2题不怎么难&#xff0c;快速解决&#xff0c;第3题看到之后马上想到了混合背包&#xff0c;打了大概半小时解决了&#xff0c;最后一道题想来想去&#xff0c;想了一堆没用的东西&#xff0c;最后打了一个垃圾DP拿了60分&…

codeforces 938E MaxHistory 组合数学

题意 给出一个长为n的序列&#xff0c;对于这个序列的任意一个排列&#xff0c;求∑fa\sum f_a∑fa​的值。 题解 我们枚举每一个aia_iai​然后&#xff0c;计算aia_iai​出现了多少次&#xff0c;然后把ai∗numa_i*numai​∗num加入到ans里面。 考虑aia_iai​什么时候出现。 a…

.NET 图形化开源爬虫Hawk 3发布

超级图形化爬虫Hawk已经发布两年半时间了&#xff0c;2015年升级到第二版&#xff0c;收到上千条用户反馈(tucao)&#xff0c;100多个红包&#xff0c;总共666块五毛~一直想攒着这笔钱&#xff0c;去北境之王天通苑的龙德商场买最心爱的阿迪王&#xff01;啥&#xff0c;你不知…

P4027-[NOI2007]货币兑换【斜率优化dp,CDQ分治】

正题 题目链接:https://www.luogu.com.cn/problem/P4027 题目大意 nnn天开始时有SSS元钱&#xff0c;每天AAA种股票价格为aia_iai​,BBB种价格为bib_ibi​。然后出售必须AAA和BBB出售相同比例&#xff0c;买入时AAA和BBB必须按照rir_iri​的比例买入。 求最后的钱最多是多少 …

【栈】【字符】匹配(jzoj 1612)

匹配 题目大意&#xff1a; 给你一个长度为n的字符串&#xff08;有多组数据&#xff09;&#xff0c;中间有小写字母&#xff08;没用的东西&#xff09;和大写字母&#xff0c;A-M是左括号&#xff0c;与之相对的是右括号Z-N&#xff08;之所以说是Z-N而不是N-Z是因为只有Z…

codeforces 940E Cashback 有趣的dp

题解 这么明显的一个dp&#xff0c;我怎么就没看出来呢&#xff1f;&#xff01; 首先我们需要一些前提条件&#xff1a;任何划分出来的一个区间的长度不应该超过c。 如果这个区间长度大于c&#xff0c;那么设lenn∗cklenn∗ck&#xff0c;那么这个区间应该被分成n个长度为c的…