luogu5024 [NOIp2018]保卫王国 (动态dp)
可以直接套动态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)相关推荐
- 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]). 注意到 ...
- Uoj 441 保卫王国
Uoj 441 保卫王国 动态 \(dp\) .今天才来写这个题. 设 \(f[u][0/1]\) 表示子树 \(u\) 中不选/选 \(u\) 时的最小权值和,显然有:\(f[u][0]=\sum ...
- [总结] 动态DP学习笔记
学习了一下动态DP 问题的来源: 给定一棵 \(n\) 个节点的树,点有点权,有 \(m\) 次修改单点点权的操作,回答每次操作之后的最大带权独立集大小. 首先一个显然的 \(O(nm)\) 的做法就 ...
- 线性代数四之动态DP(广义矩阵加速)——Can you answer these queries III,保卫王国
动态DP--广义矩阵加速 SP1716 GSS3 - Can you answer these queries III description solution code [NOIP2018 提高组] ...
- [动态dp]线段树维护转移矩阵
背景:czy上课讲了新知识,从未见到过,总结一下. 所谓动态dp,是在动态规划的基础上,需要维护一些修改操作的算法. 这类题目分为如下三个步骤:(都是对于常系数齐次递推问题) 1先不考虑修改,不考虑区 ...
- uoj#268. 【清华集训2016】数据交互(动态dp+堆)
传送门 动态dp我好像还真没咋做过--通过一个上午的努力光荣的获得了所有AC的人里面的倒数rk3 首先有一个我一点也不觉得显然的定理,如果两条路径相交,那么一定有一条路径的\(LCA\)在另一条路径上 ...
- 回文串 --- 动态dp UVA 11584
题目链接: https://cn.vjudge.net/problem/34398/origin 本题的大意其实很简单,就是找回文串,大致的思路如下: 1. 确定一个回文串,这里用到了自定义的chec ...
- P4719 【模板】“动态 DP“动态树分治(矩阵/轻重链剖分/ddp)
P4719 [模板]"动态 DP"&动态树分治 求解树上最大权独立集,但是需要支持修改. https://www.luogu.com.cn/problem/solution ...
- 【学习笔记】浅谈广义矩阵乘法——动态DP
文章目录 广义矩阵乘法 动态DP 例题:洛谷4719 以下内容是本人做题经验,如有雷同,纯属抄袭:如有不对,纯属不懂,还请指正 广义矩阵乘法 众所周知,矩阵满足乘法交换律,前一个矩阵的列必须是后一个矩 ...
最新文章
- 绝了!“修仙模式”学编程是什么体验?
- Linux MySQL Connector/C++ 编程实例
- adobe photoshop cs5已停止工作
- 【java】StringBuilder的常用两种方法与练习
- 使用commons httpclient请求https协议的webservice
- BZOJ3527:[ZJOI2014]力(FFT)
- JavaScript数组迭代方法(图解)
- 网页打开微信公众号关注界面
- 转:Vim中显示不可见字符
- php properties,PHP ReflectionClass getStaticProperties()用法及代码示例
- 352计算机调剂,今年考研金融专业352分能调剂吗?有机会调剂到哪些学校?
- Android Studio 报 非法字符: ‘\ufeff‘解决
- 电赛日志——2016年TI杯大学生电子设计竞赛 A题:降压型直流开关稳压电源
- 安卓 4.3 no such colum
- JAVA中什么 和 什么的区别--面试最经常问的(全)
- pr如何跳到关键帧_全套pr视频剪辑教程[叫兽七叔讲解]
- SAP 中的货币(Currencies)
- iphone计算机的声音怎么办,苹果计算机安装win10系统的扬声器无声音该怎么解决...
- 中国5G毫米波小基站市场行业运行动态与发展趋势预测报告
- 关于微信开放平台授权事件接收Url的配置以及参数接收
热门文章
- ***测试之情报收集
- 关于querySelector 和 document.getElementsByTagName 选中集合问题
- 004-安装CentOS7后需要的操作
- 小型自动化运维--expect脚本之自动同步
- CentOS Git服务安装
- 基于.NET的图表控件解决方案
- oracle查看列数据类型
- “网站漏洞”成电信诈骗帮凶 专家呼吁进行“立体防护”
- js-FCC算法Smallest Common Multiple。找出两个参数和它们之间的连续数字的最小公倍数。...
- lnmp、lamp、lnmpa一键安装包