最新要闻
- 每日精选:马斯克SpaceX公司副总裁私人飞机冲出跑道 网友:人身安全警告?
- 报道:浙江多地下雪 2023年第一股冷空气来了
- 2万多的日本水晶椅看着太像刑具:屁股瑟瑟发抖
- 世界动态:2023年最受期待的十款国产游戏 《黑神话:悟空》位列第一
- 全球微头条丨12核Zen4又降价了 AMD锐龙9 7900X到手3259元(首发4299)
- 观察:小米送福利!MIX Fold 2用户花1分钱可领399元保护壳
- 热资讯!仍由腾讯代理!《CF》开发商新作《命运方舟》国服官宣:2023年上线
- 【热闻】周鸿祎:360现在的对手不再是国内同行
- 苹果手表血氧监测功能被指有种族偏见 在美国被告上法庭
- RX 7900危了 消息称RTX 4070 Ti显卡降价700元:性价比大增
- 当前焦点!卡丁车手比赛撞柱身亡 主办方回应:赛道由专业设计师设计
- 天天微资讯!Doge表情包原型柴犬患白血病和肝病:情况糟糕、生命危险
- 环球看热讯:明星带货表演砍价被调侃演技巅峰上热搜:律师喊话先涨再降涉嫌价格欺诈
- 比亚迪大屏立功 中国乘用车仪表盘平均尺寸将增至近10英寸
- 世界微资讯!AMD、NV让你失望了!2023年显卡价格仍将居高不下 降价希望渺茫
- 【天天快播报】骨折价没人要!首架波音747-8宣告报废:才飞了不到30小时
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
天天观天下!Codeforces 1336 F Journey 题解
题目链接
(资料图片仅供参考)
这题的方法口糊一下没有很难,没达到3500的水准。但是写起来才发现是真的恶心(主要是容易写错),没写过这么累的题,可能难度就体现在这里吧。
计数的时候是要分类讨论的,但是核心算法都一样:启发式合并,线段树合并。把\(m^2\)对路径分成以下三类,分别统计合法的:
两条路径的LCA不同(路径的LCA指的是两个端点的LCA)。发现这两条路径的LCA必须是祖先和后代的关系,不然两条路径不可能有重合。
比如图中的红蓝两条路径就属于这一类,考虑在×处(下面两个端点的LCA)把它们统计进答案。可以在dfs的同时用线段树合并维护所有 有端点在子树内的路径的LCA的深度。在合并两个儿子的时候,把线段树中值的数量较小的拿出来,遍历其中所有的元素,并在大的那个儿子的线段树中询问得到能和当前元素匹配的数量。这部分的复杂度是\(O(nlog^2n)\)。由于n和m同阶,都用n表示了。
两条路径的LCA相同,且它们重合的部分分布在LCA的两个子树中。像下面这样:
这种情况和下面的一种情况都需要把所有LCA为x的路径都放到点x处,统一处理它们之间产生的贡献。假设现在处理LCA为root的所有的路径。把这些路径的端点以及root都拿出来建一棵虚树。为了避免重复计数,对于任意两条需要被计数的路径,我们都在它们在原树中dfs序较小的两个端点的LCA处统计,比如上面图中的×处。还是用线段树合并+启发式合并,但这次线段树中只维护每条路径dfs序较小的那个端点的信息。令当前点为pos,在遍历较小的儿子线段树中的一条路径(x,y)时,假设x在pos子树内,y在root的另外一个子树内,则如果我们沿着x→y的方向走k步到点z,那么合法的匹配路径的端点都在z的子树内。同样可以在线段树上查询来统计。
两条路径的LCA相同,且它们重合的部分分布在LCA的一个子树中。
这种情况的统计方法和上面是类似的。为了保证重合部分只在一个子树内,需要一次额外dfs对每个点求出它在root的哪个子树里。
总时间复杂度\(O(nlog^2n)\)。
调试太痛苦了
点击查看代码
#include #define rep(i,n) for(int i=0;i#define fi first#define se second#define mpr make_pair#define pb push_backvoid fileio(){ #ifdef LGS freopen("in.txt","r",stdin); freopen("out.txt","w",stdout); #endif}void termin(){ #ifdef LGS std::cout<<"\n\nEXECUTION TERMINATED"; #endif exit(0);}using namespace std;LL n,q,t,fa[150010][23],dep[150010],dfn[150010],ed[150010],ans=0,X[150010],Y[150010],LCA[150010];vector g[150010],tg[150010],dford;LL ll=0;void dfsPre(int pos,int par,int d){ fa[pos][0]=par;dep[pos]=d;dford.pb(pos); dfn[pos]=ll++; rep(i,g[pos].size()) if(g[pos][i]!=par) dfsPre(g[pos][i],pos,d+1); ed[pos]=ll-1;}int getLCA(int x,int y){ for(int i=19;i>=0;--i) if(fa[x][i]>0&&dep[fa[x][i]]>=dep[y]) x=fa[x][i]; for(int i=19;i>=0;--i) if(fa[y][i]>0&&dep[fa[y][i]]>=dep[x]) y=fa[y][i]; if(x==y) return x; for(int i=19;i>=0;--i) if(fa[x][i]!=fa[y][i]) x=fa[x][i],y=fa[y][i]; return fa[x][0];}LL getAnces(LL x,LL y){rep(i,20) if(y&(1<>1; if(to<=mid) ls[ret]=newTree(lb,mid,to); else rs[ret]=newTree(mid+1,ub,to); return ret; } LL upd(LL k,LL lb,LL ub,LL to) { if(k==0) k=newNode(); ++dat[k]; if(lb==ub) return k; LL mid=(lb+ub)>>1; if(to<=mid) ls[k]=upd(ls[k],lb,mid,to); else rs[k]=upd(rs[k],mid+1,ub,to); return k; } vector res; void getAll(LL k,LL lb,LL ub) { if(k==0) return; if(lb==ub) { rep(i,dat[k]) res.pb(lb); return; } LL mid=(lb+ub)>>1; getAll(ls[k],lb,mid);getAll(rs[k],mid+1,ub); } vector getAll(LL root) { res.clear(); getAll(root,0,n2-1); return res; } LL qry(LL k,LL lb,LL ub,LL tlb,LL tub) { if(k==0||ub>1,tlb,tub)+qry(rs[k],((lb+ub)>>1)+1,ub,tlb,tub); } LL merge(LL a,LL b) { if(a==0||b==0) return a|b; dat[a]+=dat[b]; ls[a]=merge(ls[a],ls[b]);rs[a]=merge(rs[a],rs[b]); return a; }}namespace part1{ vector v[150010]; LL combine(LL a,LL b,LL curdep) { if(a==0||b==0) return a|b; if(st::dat[a] vec=st::getAll(b); rep(i,vec.size()) { if(vec[i]>curdep-t) continue; LL v1=st::qry(a,0,st::n2-1,0,vec[i]-1),v2=st::qry(a,0,st::n2-1,vec[i]+1,curdep-t); ans+=v1+v2; } a=st::merge(a,b); return a; } LL dfs(LL pos,LL par) { LL ret=0; rep(i,v[pos].size()) { LL nxt=st::newTree(0,st::n2-1,v[pos][i]); ret=combine(ret,nxt,dep[pos]); } rep(i,g[pos].size()) if(g[pos][i]!=par) { LL nxt=dfs(g[pos][i],pos); ret=combine(ret,nxt,dep[pos]); } return ret; } void countDiffLCA() { rep(i,q) { v[X[i]].pb(dep[LCA[i]]); v[Y[i]].pb(dep[LCA[i]]); } st::init(n); dfs(1,0); }}namespace part2{ vector pths[150010]; LL curroot,rootdep; vector realver; void buildVT(vector vers) { realver.clear(); rep(i,vers.size()) tg[vers[i]].clear(); sort(vers.begin(),vers.end());vers.erase(unique(vers.begin(),vers.end()),vers.end()); sort(vers.begin(),vers.end(),[](LL xx,LL yy){return dfn[xx] stk;stk.push(vers[0]); realver=vers; repn(i,vers.size()-1) { LL pos=vers[i],lca=getLCA(pos,stk.top()); if(lca==stk.top()) stk.push(pos); else { while(dep[stk.top()]>dep[lca]) { int pp=stk.top();stk.pop(); int nn=stk.top();if(dep[nn]1) { int pp=stk.top();stk.pop(); tg[stk.top()].pb(pp); } } vector v[150010]; LL fr[150010]; LL walk(LL curpos,LL to,LL stp) { LL rd=dep[getLCA(curpos,to)]; LL tot=dep[curpos]+dep[to]-rd*2; if(tot vec=st::getAll(b);rep(i,vec.size()) vec[i]=dford[vec[i]]; rep(i,vec.size()) { LL walkdist=max(t,dep[curpos]-rootdep+1),to=walk(curpos,vec[i],walkdist); if(to==-1) continue; LL vv=st::qry(a,0,st::n2-1,dfn[to],ed[to]); ans+=vv; } a=st::merge(a,b); return a; } LL dfsTwo(LL pos) { LL ret=0; rep(i,v[pos].size()) { LL nxt=st::newTree(0,st::n2-1,dfn[v[pos][i]]); if(pos!=curroot) ret=combineTwo(ret,nxt,pos); } rep(i,tg[pos].size()) { LL nxt=dfsTwo(tg[pos][i]); if(pos!=curroot) ret=combineTwo(ret,nxt,pos); } return ret; } void dfsMarkFr(LL pos,LL mk) { if(mk==-1&&pos!=curroot) mk=dfn[pos]; fr[pos]=mk; rep(i,tg[pos].size()) dfsMarkFr(tg[pos][i],mk); } LL combineOne(LL a,LL b) { if(a==0||b==0) return a|b; if(st::dat[a] vec=st::getAll(b); rep(i,vec.size()) { if(vec[i]==dfn[curroot]) { ans+=st::dat[a]; continue; } LL v1=st::qry(a,0,st::n2-1,0,vec[i]-1),v2=st::qry(a,0,st::n2-1,vec[i]+1,st::n2-1); ans+=v1+v2; } a=st::merge(a,b); return a; } LL dfsOne(LL pos) { LL ret=0; rep(i,v[pos].size()) { LL nxt=st::newTree(0,st::n2-1,fr[v[pos][i]]); if(dep[pos]-rootdep>=t) ret=combineOne(ret,nxt); } rep(i,tg[pos].size()) { LL nxt=dfsOne(tg[pos][i]); if(dep[pos]-rootdep>=t) ret=combineOne(ret,nxt); } return ret; } void countSameLCA() { rep(i,q) { if(dfn[X[i]]>dfn[Y[i]]) swap(X[i],Y[i]); pths[LCA[i]].pb(mpr(X[i],Y[i])); } repn(root,n) if(pths[root].size()) { curroot=root;rootdep=dep[root]; vector vers={root}; rep(i,pths[root].size()) vers.pb(pths[root][i].fi),vers.pb(pths[root][i].se); buildVT(vers); rep(i,realver.size()) v[realver[i]].clear(); rep(i,pths[root].size()) if(pths[root][i].fi!=root&&pths[root][i].se!=root) v[pths[root][i].fi].pb(pths[root][i].se); st::init(n); dfsTwo(root); dfsMarkFr(root,-1);fr[root]=dfn[root]; rep(i,realver.size()) v[realver[i]].clear(); rep(i,pths[root].size()) v[pths[root][i].fi].pb(pths[root][i].se),v[pths[root][i].se].pb(pths[root][i].fi); st::init(n); dfsOne(root); } }}int main(){ fileio(); cin>>n>>q>>t; LL x,y; rep(i,n-1) { scanf("%lld%lld",&x,&y); g[x].pb(y);g[y].pb(x); } dfsPre(1,0,0); rep(i,20) repn(j,n) fa[j][i+1]=fa[fa[j][i]][i]; rep(i,q) { scanf("%lld%lld",&X[i],&Y[i]); LCA[i]=getLCA(X[i],Y[i]); } part1::countDiffLCA(); part2::countSameLCA(); cout<
天天观天下!Codeforces 1336 F Journey 题解
每日精选:马斯克SpaceX公司副总裁私人飞机冲出跑道 网友:人身安全警告?
报道:浙江多地下雪 2023年第一股冷空气来了
2万多的日本水晶椅看着太像刑具:屁股瑟瑟发抖
世界动态:2023年最受期待的十款国产游戏 《黑神话:悟空》位列第一
当前头条:FreeSWITCH给Say模块增加中文语音
全球微头条丨12核Zen4又降价了 AMD锐龙9 7900X到手3259元(首发4299)
观察:小米送福利!MIX Fold 2用户花1分钱可领399元保护壳
热资讯!仍由腾讯代理!《CF》开发商新作《命运方舟》国服官宣:2023年上线
【热闻】周鸿祎:360现在的对手不再是国内同行
苹果手表血氧监测功能被指有种族偏见 在美国被告上法庭
Fiddler V5.0 英文/汉化 Windows 抓包工具 【12月29日亲测有效】
RX 7900危了 消息称RTX 4070 Ti显卡降价700元:性价比大增
当前焦点!卡丁车手比赛撞柱身亡 主办方回应:赛道由专业设计师设计
天天微资讯!Doge表情包原型柴犬患白血病和肝病:情况糟糕、生命危险
环球看热讯:明星带货表演砍价被调侃演技巅峰上热搜:律师喊话先涨再降涉嫌价格欺诈
比亚迪大屏立功 中国乘用车仪表盘平均尺寸将增至近10英寸
世界微资讯!AMD、NV让你失望了!2023年显卡价格仍将居高不下 降价希望渺茫
【天天快播报】骨折价没人要!首架波音747-8宣告报废:才飞了不到30小时
《阿凡达2》成2022全球票房亚军!仅次于《壮志凌云2》
世界通讯!今年春节乐趣不限量!PICO 4新春礼盒成年货新选择
如何选购云服务器
终极.NET混淆器丨.NET Reactor产品介绍
linux跟踪技术之ebpf
天天快报!AcWing246. 区间最大公约数
【世界独家】30层楼高、叶轮直径191米!国内单机容量最大高原山地风机成功吊装
全球今头条!19999元!铁威马发布12盘位NAS T12-450:总容量可达240TB
羊了个羊创始人没想到一季度挣了20万:公司仅7人参保
焦点速递!俞敏洪最想读的三本书:《道德经》《红楼梦》《金瓶梅》
Cubase11安装破解图文教程 【2022年12月29日亲测有效】
焦点速读:linux Makefile 如何将生成的 .o 文件放到指定文件夹
热点聚焦:python字典中dict.get()和dict.setdefault()的异同点
LG发布全新光学变焦手机镜头模组:支持4~9倍光学变焦自由切换
【独家】女子搬家后发现新房藏有豪华地堡:眼尖网友指出关键所在
每日简讯:《羊了个羊》老板曾被嘲笑不懂做游戏:最初目标是一季度挣20万
当前热议!一加携手AAC瑞声科技联合打造!官方详解安卓最强马达细节
【聚看点】网络游戏作品首次!《王者荣耀》《和平精英》入藏中国国家版本馆
热点在线丨还有企业没有在用JNPF吗! 适配于多行业的管理系统,各企业之首选
速看:火山引擎 DataTester:如何做 A/B 实验的假设检验
每日热议!折腾了我一周,原来Netty网络编程就是这么个破玩意儿!!!
【报资讯】LF Professional及WINTERACTER产品简介
全球短讯!几个函数的使用例子:更新VBRK-XBLNR,IB01设备BOM创建,LI11N输入库存盘点
速看:Chrome浏览器强化安全性:将阻止HTTP链接下载文件
真功夫快餐成被执行人:之前因侵权被功夫巨星李小龙之女起诉
热讯:京东苹果年货节超低价:iPhone 14系列最高降1000元
天天新资讯:壕无人性!Uzi沉迷《原神》竟然直播时充钱充到限额
世界短讯!赢麻!我国世界热点论文数量第一:远超美国、日本
天天日报丨【Python语法糖】闭包和装饰器
天天热头条丨Intel 13代酷睿i5-1350P使劲挤牙膏:只提升了2%
简讯:对标理想L8、问界M7 魏牌首款大六座SUV官宣:设计很有料
3999元 红魔8 Pro系列首销火爆售罄:高管感到出乎意料
天天时讯:致郑新黄河大桥200多辆车连撞!河南气象台回应郑州未发大雾预警
苹果市值一夜蒸发约4431亿元:iPhone出货量将迎锐减 万元高端机买不动了
每日热讯!郑州200多车相撞 雾天驾车开雾灯还是双闪灯?网友吵翻
信息:电竞级调校!Redmi K60 Pro《原神》须弥城跑图实测:1小时不降亮度
环球滚动:VueJS使用addEventListener的事件如何触发执行函数的this
农四师是什么意思?农四师属于哪个地区?
【焦点热闻】说好的比加油方便呢:英国特斯拉车主抱怨充电要排队数小时
世界视点!4999元 米粉入手小米13限定色:他最满意的安卓手机 太凉快了
今日热文:Win11 2023年“Moment 3”更新内容流出:将针对折叠屏设备进行优化
天天观热点:基于北斗定位实现!高德地图在全国近360城上线“绿灯导航”
2023新剧排排坐
时代少年团综艺节目有哪些?时代少年团成员资料
岁月不居天道酬勤是什么意思?时光不居天道酬勤的出处是哪里?
梅林是什么意思?梅林固件有什么功能?
指纹膜是什么?如何自制指纹膜?
骆驼的体重大约是多少?骆驼奶粉的功效和作用
湖北人有哪些特点?湖北人为什么被称为九头鸟?
包上恩演的电视剧有哪些?包上恩个人资料身高详情
大音希声扫阴翳是什么意思?大音希声扫阴翳出自哪里?
补丁怎么用?补丁的作用有哪些?
联想扬天4600c怎么样?联想扬天4600c参数
win7搜索在哪里?win7蓝牙怎么开启?
(三)elasticsearch 源码之启动流程分析
焦点要闻:特色功能(锐捷云桌面篇)
qq中毒了是什么原因?qq中毒了怎么办?
Win8系统如何关机?win8系统怎么连接wifi?
贝尔金路由器如何设置?贝尔金路由器怎么恢复出厂设置?
天天滚动:手机App秒测血氧 能替代血氧仪吗?专家科普
世界微动态丨雅阁、CR-V均中招!本田中国召回近20万辆混动车 润滑油不够
过去一年都听过什么歌?网易云音乐2022年度听歌报告正式上线
环球关注:汉仪字库定制打造!钉钉进步体来了:永久免费商用
【全球快播报】NASA分享火星冬天航拍照片:色彩斑斓、唯美壮阔
【爬虫实战项目】Python爬取Top100电影榜单数据保存本地(附源码)
【天天新要闻】说透IO多路复用模型
关注:李子柒与微念达成和解 断更500多天的“她”何时回归?
焦点日报:Epic免费送《死亡搁浅》导剪版变标准版后续:官方删除道歉微博
环球关注:你在干啥?2022年中国人每天用手机时长创新高:都在狂刷视频、玩游戏等
百事通!Redmi K60把国产2K OLED屏从不可能变成现实:这过程很痛苦很艰辛
全球观点:苹果市值一夜蒸发约4431亿元 曝其有意砍价iPhone供应链 确保自己利润
DirtyPipe(CVE-2022-0847)漏洞分析
热点聚焦:笔记本SSD普及率今年已达92%:机械硬盘凉凉了
PC硬件机能榨干的日子一去不返!显卡危机不会再有了
【环球报资讯】机箱接口套路多 这些小知识你都知道吗?
【焦点热闻】设计时速250公里!银兰高铁全线开通运营:最快3小时可达
暴降千元性价比还是低!苹果欲放弃iPhone 14销售最差机型:你会买Plus吗
委员建议禁放烟花改为限时燃放 网友争议是否污染环境:多地明确禁放
头条焦点:AMD机会来了?商家预售NV RTX 4070 Ti:售价最高8399元
天天快讯:把WSL安装到指定目录下的简易完美方法
环球热点!Azure 使用技巧