可以直接套动态dp,但因为它询问之间相互独立,所以可以直接倍增记x转移到fa[x]的矩阵

  1 #include<bits/stdc++.h>
  2 #define CLR(a,x) memset(a,x,sizeof(a))
  3 using namespace std;
  4 typedef long long ll;
  5 typedef pair<int,int> pa;
  6 const int maxn=1e5+10;
  7 const ll inf=1e17;
  8
  9 inline ll rd(){
 10     ll x=0;char c=getchar();int neg=1;
 11     while(c<'0'||c>'9'){if(c=='-') neg=-1;c=getchar();}
 12     while(c>='0'&&c<='9') x=x*10+c-'0',c=getchar();
 13     return x*neg;
 14 }
 15
 16 int N,M,p[maxn];
 17 int eg[maxn*2][2],egh[maxn],ect,fa[maxn][22],dep[maxn];
 18 ll f[maxn][2];
 19 struct Mat{
 20     int n,m;ll a[3][3];
 21     Mat(int a0=0,int a1=0,ll a2=0,ll a3=0,ll a4=0,ll a5=0){
 22         n=a0,m=a1;a[1][1]=a2,a[1][2]=a3,a[2][1]=a4,a[2][2]=a5;
 23     }
 24 }trans[maxn][22];
 25
 26 inline Mat operator * (Mat a,Mat b){
 27     Mat re;
 28     re.n=a.n,re.m=b.m;
 29     for(int i=1;i<=re.n;i++){
 30         for(int j=1;j<=re.m;j++){
 31             re.a[i][j]=inf;
 32             for(int k=1;k<=a.m;k++){
 33                 re.a[i][j]=min(re.a[i][j],a.a[i][k]+b.a[k][j]);
 34             }
 35         }
 36     }return re;
 37 }
 38
 39 inline void adeg(int a,int b){
 40     eg[++ect][0]=b,eg[ect][1]=egh[a],egh[a]=ect;
 41 }
 42
 43 void dfs1(int x){
 44     f[x][0]=0,f[x][1]=p[x];
 45     for(int i=egh[x];i;i=eg[i][1]){
 46         int b=eg[i][0];if(b==fa[x][0]) continue;
 47         fa[b][0]=x,dep[b]=dep[x]+1;
 48         dfs1(b);
 49         f[x][0]+=f[b][1],f[x][1]+=min(f[b][0],f[b][1]);
 50     }
 51 }
 52
 53 void dfs2(int x){
 54     if(fa[x][0]){
 55         ll s0,s1;
 56         s0=f[fa[x][0]][0]-f[x][1];
 57         s1=f[fa[x][0]][1]-min(f[x][0],f[x][1]);
 58         trans[x][0]=Mat(2,2,inf,s1,s0,s1);
 59         for(int i=0;fa[x][i]&&fa[fa[x][i]][i];i++){
 60             fa[x][i+1]=fa[fa[x][i]][i];
 61             trans[x][i+1]=trans[x][i]*trans[fa[x][i]][i];
 62         }
 63     }
 64     for(int i=egh[x];i;i=eg[i][1]){
 65         int b=eg[i][0];if(b==fa[x][0]) continue;
 66         dfs2(b);
 67     }
 68 }
 69
 70 inline ll update(int x,int y,Mat &fx,Mat &fy){
 71     for(int i=log2(dep[x]-dep[y]);i>=0&&dep[x]!=dep[y];i--){
 72         if(dep[fa[x][i]]>=dep[y])
 73             fx=fx*trans[x][i],x=fa[x][i];
 74     }
 75     int lca;Mat fl;
 76     if(x==y){
 77         lca=y;fl=fx;
 78         if(fy.a[1][1]==inf) fl.a[1][1]=inf;
 79         else if(fy.a[1][2]==inf) fl.a[1][2]=inf;
 80     }else{
 81         for(int i=log2(dep[x]);i>=0;i--){
 82             if(fa[x][i]!=fa[y][i]){
 83                 fx=fx*trans[x][i],fy=fy*trans[y][i];
 84                 x=fa[x][i],y=fa[y][i];
 85             }
 86         }
 87         lca=fa[x][0];
 88         // printf("~%d %d %d %d %d %d\n",x,fx.a[1][1],fx.a[1][2],y,fy.a[1][1],fy.a[1][2]);
 89         ll a0=f[lca][0]-f[x][1]-f[y][1]+fx.a[1][2]+fy.a[1][2];
 90         ll a1=f[lca][1]-min(f[x][1],f[x][0])-min(f[y][1],f[y][0])+min(fx.a[1][1],fx.a[1][2])+min(fy.a[1][1],fy.a[1][2]);
 91         fl=Mat(1,2,a0,a1,0,0);
 92     }
 93     for(int i=log2(dep[lca]);i>=0;i--){
 94         if(fa[lca][i]){
 95             fl=fl*trans[lca][i];
 96             lca=fa[lca][i];
 97         }
 98     }
 99     return min(fl.a[1][1],fl.a[1][2]);
100 }
101
102 int main(){
103     // freopen("testdata.in","r",stdin);
104     int i,j,k;
105     N=rd(),M=rd();rd();
106     for(i=1;i<=N;i++) p[i]=rd();
107     for(i=1;i<N;i++){
108         int a=rd(),b=rd();
109         adeg(a,b);adeg(b,a);
110     }
111     dep[1]=1;dfs1(1);dfs2(1);
112     for(i=1;i<=M;i++){
113         int a=rd(),x=rd(),b=rd(),y=rd();
114         if(dep[a]<dep[b]) swap(a,b),swap(x,y);
115         if(fa[a][0]==b&&!x&&!y){
116             printf("-1\n");continue;
117         }
118         Mat fx,fy;
119         if(x) fx=Mat(1,2,inf,f[a][1],0,0);
120         else fx=Mat(1,2,f[a][0],inf,0,0);
121         if(y) fy=Mat(1,2,inf,f[b][1],0,0);
122         else fy=Mat(1,2,f[b][0],inf,0,0);
123         printf("%lld\n",update(a,b,fx,fy));
124     }
125     return 0;
126 }

转载于:https://www.cnblogs.com/Ressed/p/9967256.html

luogu5024 [NOIp2018]保卫王国 (动态dp)相关推荐

  1. BZOJ5466 NOIP2018保卫王国(倍增+树形dp)

    暴力dp非常显然,设f[i][0/1]表示i号点不选/选时i子树内的答案,则f[i][0]=Σf[son][1],f[i][1]=a[i]+Σmin(f[son][0],f[son][1]). 注意到 ...

  2. Uoj 441 保卫王国

    Uoj 441 保卫王国 动态 \(dp\) .今天才来写这个题. 设 \(f[u][0/1]\) 表示子树 \(u\) 中不选/选 \(u\) 时的最小权值和,显然有:\(f[u][0]=\sum ...

  3. [总结] 动态DP学习笔记

    学习了一下动态DP 问题的来源: 给定一棵 \(n\) 个节点的树,点有点权,有 \(m\) 次修改单点点权的操作,回答每次操作之后的最大带权独立集大小. 首先一个显然的 \(O(nm)\) 的做法就 ...

  4. 线性代数四之动态DP(广义矩阵加速)——Can you answer these queries III,保卫王国

    动态DP--广义矩阵加速 SP1716 GSS3 - Can you answer these queries III description solution code [NOIP2018 提高组] ...

  5. [动态dp]线段树维护转移矩阵

    背景:czy上课讲了新知识,从未见到过,总结一下. 所谓动态dp,是在动态规划的基础上,需要维护一些修改操作的算法. 这类题目分为如下三个步骤:(都是对于常系数齐次递推问题) 1先不考虑修改,不考虑区 ...

  6. uoj#268. 【清华集训2016】数据交互(动态dp+堆)

    传送门 动态dp我好像还真没咋做过--通过一个上午的努力光荣的获得了所有AC的人里面的倒数rk3 首先有一个我一点也不觉得显然的定理,如果两条路径相交,那么一定有一条路径的\(LCA\)在另一条路径上 ...

  7. 回文串 --- 动态dp UVA 11584

    题目链接: https://cn.vjudge.net/problem/34398/origin 本题的大意其实很简单,就是找回文串,大致的思路如下: 1. 确定一个回文串,这里用到了自定义的chec ...

  8. P4719 【模板】“动态 DP“动态树分治(矩阵/轻重链剖分/ddp)

    P4719 [模板]"动态 DP"&动态树分治 求解树上最大权独立集,但是需要支持修改. https://www.luogu.com.cn/problem/solution ...

  9. 【学习笔记】浅谈广义矩阵乘法——动态DP

    文章目录 广义矩阵乘法 动态DP 例题:洛谷4719 以下内容是本人做题经验,如有雷同,纯属抄袭:如有不对,纯属不懂,还请指正 广义矩阵乘法 众所周知,矩阵满足乘法交换律,前一个矩阵的列必须是后一个矩 ...

最新文章

  1. 绝了!“修仙模式”学编程是什么体验?
  2. Linux MySQL Connector/C++ 编程实例
  3. adobe photoshop cs5已停止工作
  4. 【java】StringBuilder的常用两种方法与练习
  5. 使用commons httpclient请求https协议的webservice
  6. BZOJ3527:[ZJOI2014]力(FFT)
  7. JavaScript数组迭代方法(图解)
  8. 网页打开微信公众号关注界面
  9. 转:Vim中显示不可见字符
  10. php properties,PHP ReflectionClass getStaticProperties()用法及代码示例
  11. 352计算机调剂,今年考研金融专业352分能调剂吗?有机会调剂到哪些学校?
  12. Android Studio 报 非法字符: ‘\ufeff‘解决
  13. 电赛日志——2016年TI杯大学生电子设计竞赛 A题:降压型直流开关稳压电源
  14. 安卓 4.3 no such colum
  15. JAVA中什么 和 什么的区别--面试最经常问的(全)
  16. pr如何跳到关键帧_全套pr视频剪辑教程[叫兽七叔讲解]
  17. SAP 中的货币(Currencies)
  18. iphone计算机的声音怎么办,苹果计算机安装win10系统的扬声器无声音该怎么解决...
  19. 中国5G毫米波小基站市场行业运行动态与发展趋势预测报告
  20. 关于微信开放平台授权事件接收Url的配置以及参数接收

热门文章

  1. ***测试之情报收集
  2. 关于querySelector 和 document.getElementsByTagName 选中集合问题
  3. 004-安装CentOS7后需要的操作
  4. 小型自动化运维--expect脚本之自动同步
  5. CentOS Git服务安装
  6. 基于.NET的图表控件解决方案
  7. oracle查看列数据类型
  8. “网站漏洞”成电信诈骗帮凶 专家呼吁进行“立体防护”
  9. js-FCC算法Smallest Common Multiple。找出两个参数和它们之间的连续数字的最小公倍数。...
  10. lnmp、lamp、lnmpa一键安装包