JZOJ5248. 【NOIP2017提高A组模拟8.10】花花的聚会
来源:互联网 发布:软件下载引导页源码 编辑:程序博客网 时间:2024/05/17 07:18
分析
题目的意思就是,在一棵树上面,某些点可以花费一些代价,向上走一定的步数,问某个节点到根的最小代价。
设
转移:如果这个点i,可以花费一个代价w,向上走k步,
那么
这样的时间复杂度是
我们在想一下,将根到i的路径单独出来,
这个最小值就是区间的最小值,可以用线段树来维护。
我们在dfs的时候,以深度建一棵线段树,每次查询前面的,
在向下递归前,将当前节点的
换一种思路,求某个点到它k级父亲的路径上的最小值,想到了倍增,
因为取min是可以重复取的,跟RMQ一样。
code
#include<cstdio>#include<iostream>#include<algorithm>#include <cstring>#include <string.h>#include <cmath>#include <math.h>#define N 100003#define db doubleusing namespace std;struct note{ int v,k,w,next;}t[N];int fa[N],next[N],b[N],a[N],p[N];int n,m,q,f[N],x,y;int tr[4*N];char ch;void read(int &n){ n=0; ch=getchar(); while((ch<'0' || ch>'9') && ch!='-')ch=getchar(); int w=1; if(ch=='-')w=-1,ch=getchar(); while('0'<=ch && ch<='9')n=n*10+ch-'0',ch=getchar(); n*=w;}void write(int x){ if(x>9) write(x/10); putchar(x%10+'0');}int find(int x,int l,int r,int ll,int rr){ if(l==ll && r==rr)return tr[x]; int m=(l+r)>>1; if(rr<=m)return find(x<<1,l,m,ll,rr); if(ll>m)return find((x<<1)+1,m+1,r,ll,rr); return min(find(x<<1,l,m,ll,m),find((x<<1)+1,m+1,r,m+1,rr));}void ins(int x,int l,int r,int y,int z){ if(l==r) { tr[x]=z; return; } int m=(l+r)>>1; if(y<=m)ins(x<<1,l,m,y,z);else ins((x<<1)+1,m+1,r,y,z); tr[x]=min(tr[x<<1],tr[(x<<1)+1]);}void dfs(int x,int deep){ for(int i=p[x];i;i=t[i].next) f[x]=min(f[x],find(1,1,n,max(deep-t[i].k,1),deep-1)+t[i].w); //printf("%d %d %d\n",x,deep,f[x]); ins(1,1,n,deep,f[x]); for(int i=b[x];i;i=next[i]) dfs(a[i],deep+1);}int main(){ read(n);read(m); for(int i=1;i<n;i++) { read(x);read(y); fa[x]=y; next[i]=b[y]; a[i]=x; b[y]=i; } for(int i=1;i<=m;i++) read(t[i].v),read(t[i].k),read(t[i].w),t[i].next=p[t[i].v],p[t[i].v]=i; memset(f,127,sizeof(f)); memset(tr,127,sizeof(tr)); p[1]=f[1]=0; dfs(1,1); read(q); for(int i=1;i<=q;i++) read(x),write(f[x]),putchar('\n');}
阅读全文
0 0
- JZOJ5248. 【NOIP2017提高A组模拟8.10】花花的聚会
- 【jzoj5248】【NOIP2017提高A组模拟8.10】【花花的聚会】【动态规划】【可持久化线段树】
- 花花的聚会【NOIP2017提高A组模拟8.10】
- 【JZOJ 5248】【NOIP2017提高A组模拟8.10】花花的聚会
- 【NOIP2017提高A组模拟8.16】花花的森林
- 【jzoj5286】【NOIP2017提高A组模拟8.16】【花花的森林 】【时间倒流】
- JZOJ 5286. 【NOIP2017提高A组模拟8.16】花花的森林
- JZOJ 5286. 【NOIP2017提高A组模拟8.16】花花的森林 (Standard IO)
- 【NOIP2017提高组A组模拟8.17】行程的交集
- 【NOIP2017提高A组模拟9.5】NYG的背包
- 【JZOJ 5249】【NOIP2017提高A组模拟8.10】文本编辑器
- JZOJ5249. 【NOIP2017提高A组模拟8.10】文本编辑器
- 【NOIP2017提高A组模拟8.10】文本编辑器
- 【JZOJ5249】【NOIP2017提高A组模拟8.10】文本编辑器
- A【NOIP2017提高组模拟12.18】
- 【JZOJ4928】【NOIP2017提高组模拟12.18】A
- 【NOIP2017提高组模拟12.18】A
- 【JZOJ4928】【NOIP2017提高组模拟12.18】A
- 树梅派3启用vnc远程控制
- Java学习笔记—数组的用法
- 详解5种跨域方式及其原理
- Android 内存溢出(OOM)问题分析方法
- oracle中的函数
- JZOJ5248. 【NOIP2017提高A组模拟8.10】花花的聚会
- js代码--时间小人
- Linux设备模型(4)_sysfs
- [绍棠_Swift] Swift中类和结构体的区别
- 我所理解的生活
- 自定义类实现克隆
- lambda表达式语法
- 网页获取数据内容中字符串为问号"?"
- 数组与矩阵的区别 Python