题意

给一颗边带权的树,边权为1~5,多次询问树上某条路径组成的边权序列的LIS

思路

假设已知边权序列,设\(f_{i,j}\)表示处理了前\(i\)个数,当前\(LIS\)中的最后一个数为\(j\)时的\(LIS\)长度,显然有\(f_{i,j}=max(f_{i-1,k}+1),(k\leq j)\),由于边权为1~5,这个算法一次是\(O(n)\)的

通过上述对\(f\)的处理的思路就可以得到倍增法

设\(fa_{rt,i}\)表示从\(rt\)向上跳\(2^i\)步到的节点
设\(g_{rt,i,j,k}\),表示从\(rt\)向上跳\(2^i\)步得到的边权序列,当前\(LIS\)中的最小数为\(j\),最大数为\(k\)时的\(LIS\)长度

有转移方程

\(g_{rt,i,j,k}=max(g_{rt,i-1,j,p}+g_{fa_{rt,i-1},i-1,p,k})\)

利用这个数组优化上面求\(f\)的过程即可

注意:虽然从\(y\)向\(lca\)走求的是最长不上升子序列(与\(LIS\)相反),但是可以发现\(g\)数组在\(j\geq k\)就可以表示最长不上升子序列(虽然这样与定义不符,但确实可以用

Code

#include<bits/stdc++.h>
#define N 30005
#define Max(x,y) ((x)>(y)?(x):(y))
#define Min(x,y) ((x)<(y)?(x):(y))
using namespace std;
const int temp = 16;
int n,m,dep[N];
int dp[2][temp][6],g[N][temp][6][6],f[N][temp];
int l[N],r[N],cl,cr;//倍增时向上经过的断点
bool rev;struct Edge
{int next,to,dis;
}edge[N<<1];int head[N],cnt=1;
void add_edge(int from,int to,int dis)
{edge[++cnt].next=head[from];edge[cnt].to=to;edge[cnt].dis=dis;head[from]=cnt;
}
template <class T>
void read(T &x)
{char c;int sign=1;while((c=getchar())>'9'||c<'0') if(c=='-') sign=-1; x=c-48;while((c=getchar())>='0'&&c<='9') x=x*10+c-48; x*=sign;
}
void dfs(int rt,int fa)
{dep[rt]=dep[fa]+1;for(int i=head[rt];i;i=edge[i].next){int v=edge[i].to;if(v==fa) continue;f[v][0]=rt;for(int j=1;j<=5;++j)for(int k=1;k<=5;++k) if(Min(j,k)<=edge[i].dis&&Max(j,k)>=edge[i].dis) g[v][0][j][k]=1;for(int j=1;j<temp;++j){f[v][j]=f[f[v][j-1]][j-1];if(!f[v][j]) break;for(int q=1;q<=5;++q)for(int p=1;p<=5;++p)for(int k=Min(p,q);k<=Max(p,q);++k)g[v][j][q][p]=Max(g[v][j][q][p],g[v][j-1][q][k]+g[f[v][j-1]][j-1][k][p]);//attention }dfs(v,rt);}
}
void init(int x,int y)
{rev=cl=cr=0;if(dep[x]<dep[y]) {swap(x,y);rev=1;}for(int i=temp-1;i>=0;--i) if(dep[f[x][i]]>=dep[y]) x=f[x][i],l[++cl]=i;if(x==y) return;for(int i=temp-1;i>=0;--i) if(f[x][i]!=f[y][i]) x=f[x][i],y=f[y][i],l[++cl]=i,r[++cr]=i;l[++cl]=0; r[++cr]=0;
}
int DP(int x,int y,int cl,int cr,int l[],int r[])
{for(int i=1;i<=cl;++i){for(int j=1;j<=5;++j)//之前是j for(int k=j;k<=5;++k)//现在是k dp[0][i][k]=Max(dp[0][i][k],dp[0][i-1][j]+g[x][l[i]][j][k]);x=f[x][l[i]];}for(int i=1;i<=cr;++i)//y相反 {for(int j=5;j>=1;--j)//之前是jfor(int k=j;k>=1;--k)//现在是kdp[1][i][k]=Max(dp[1][i][k],dp[1][i-1][j]+g[y][r[i]][j][k]);y=f[y][r[i]];}int ans=0;for(int i=1;i<=5;++i)for(int j=i;j<=5;++j)ans=Max(ans,dp[0][cl][i]+dp[1][cr][j]);return ans;
}
int main()
{read(n);for(int i=1;i<n;++i){int x,y,z;read(x);read(y);read(z);add_edge(x,y,z);add_edge(y,x,z);}dfs(1,0);read(m);while(m--){memset(dp,0,sizeof(dp));int x,y;read(x);read(y);init(x,y);printf("%d\n",rev ? DP(x,y,cr,cl,r,l) : DP(x,y,cl,cr,l,r));}return 0;
}

转载于:https://www.cnblogs.com/Chtholly/p/11603677.html

[LGOJ5558]心上秋(倍增)相关推荐

  1. CTYZ的树论赛(P5557 旅行/P5558 心上秋/P5559 失昼城的守星使)

    总结 由于受中秋节影响,没能在比赛时间内切掉\(T3\) 思维难度\(T1<T2<T3\),代码难度\(T1>T2>T3\) P5557 旅行 显然跳到环上去后就可以直接模了, ...

  2. 科大星云诗社动态20210601

    [每日一诗] 来自@心上秋 的原创作品金陵烟雨迷离的六朝金粉,昔年宫阙千重,而今巷陌寻常,菜市口的吆喝声里,卷尽了古今雄图,石头城下销尽三吴兵戈气,玄武湖边曾记得布衣霸业,桥与弄轮转,晨曦微明,鸡鸣寺 ...

  3. 我感觉的优美诗句品鉴(不定时更新)

    从此烟雨落金城,一人撑伞两人行 从此烟雨落金城,无人无伞雨中行 山前山后各有忧愁,有风无风都是自由 手持烟火以谋生,心怀诗意以谋爱 你要走,走到灯火通明 你要忍,忍到春暖花开 他只能喘着自由,说千金不 ...

  4. 天刀一代宗师服务器维护,3月13日服务器例行维护公告(已完成)

    亲爱的玩家: 青龙乱舞区.大地飞鹰区.陌上花开区.天命风流区.沧海云帆区.血海飘香区.边城浪子区全部服务器将在3月13日6:00~10:00停机维护更新,维护完成后上述各服务器客户端版本更新至2.0. ...

  5. 【福利】仲秋节祝福短信合辑

    辛苦整理的,觉得有用的就顶一下,给个辛苦费...另外个人感觉还是打电话比较好一点..短信让人变的陌生起来了... 而且节日的时候手机群发很痛苦的说..总是发不出去..不过之前用了一个电脑客户端比较不错 ...

  6. 准备刺第一针了(飞秋官方下载)

    WZSZF飞鸽:2013年10月26日,它还有一双花椒粒一样大小的眼睛,它还会丰富多腔地叫唤,叫起来婉转动听,毛大爹,原来我们不能离开眼镜啊,第二天,呜的一声,简直不相信自己的耳朵,放生青蛙今天外公外 ...

  7. 梦在远方,你依然在心上

    (一)遇江南 轻踱岁月的长廊,慢舒流年画卷,悠然回到了往昔.水墨江南的气息中,温良如玉的你,烟雨身上披,清风足下生,玉笛声飞.禅意悠扬,美如天籁的清音雅韵.飘逸洒脱的身影穿过秋雨的薄凉,似惊鸿,渡寒塘 ...

  8. 待得秋来九月八,我花开时百花杀; 冲天香阵透长安,满城尽带黄金甲

    前些天看<金报>中介绍黄巢的生平事迹,其中有首诗关于秋天菊花的,虽说可以用暴君来形容黄巢的残暴,但单就这首诗来,还是非常的气势逼人,今天google了一下这首诗的解说,如下         ...

  9. 2019年秋招是有多难鸭?

    此篇总结秋招两月的经历,从心态坚定到逐渐被打击,然后到坦然面对现实,到最后拿到保底offer,也希望此篇小结能够起到给即将求职的应届生有所提示! 目录 1.本人自身介绍 2.秋招三月进程 3.总结 1 ...

最新文章

  1. java jni调用dll文件_Java通过jni调用动态链接库
  2. 机器学习算法基础——机器学习概述
  3. SpringBoot 集成ip2region
  4. oracle收发邮件存储过程
  5. Qt 串口通信 高速发送出错的解决方法总结
  6. Python中的@classmethod修饰符
  7. tp3.2 获取post,get,session,cookie变量
  8. 线性代数-n维向量知识点总结
  9. 万能五笔输入法弹窗_万能五笔输入法广告屏蔽的方法
  10. 编写递归算法,计算二叉树叶子结点的数目。
  11. 蚁群算法 c语言,基本蚁群算法代码C版
  12. cpc金价难以琢磨 投行是否成“南郭先生”
  13. Flutter 打包问题 Could not resolve io.flutter:arm64_v8a_release
  14. 歌词制作软件C#实现
  15. C#练习题答案: 寻找恩人【难度:1级】--景越C#经典编程题库,1000道C#基础练习题等你来挑战
  16. 新手入门AI (Adobe Illustrator)软件工具详解(一)
  17. 畜牧业适宜性评价算法
  18. pyecharts制作地图Map
  19. linux中Iscpi命令详解(四)
  20. 如何将 java 项目打包成exe可执行文件

热门文章

  1. 养眼的大自然色卡,设计师必备
  2. linux 查看磁盘信息
  3. html提取正文,网页正文提取工具Readability
  4. 用js来写一个478呼吸动画来做393的默想吧-用js来写一个478呼吸动画
  5. 【三十天精通 Vue 3】 专栏内容介绍
  6. 拜占庭容错(BFT)算法介绍
  7. 《计算机组成原理》— 计算机组成原理试卷一(期末复习备用)
  8. Spring框架学习笔记,超详细!!(4)
  9. 一个普通玩家眼中的网博会
  10. airbnb房东_麻烦找房东侵入式监视筛查方法可能是罪魁祸首