51Nod 1789 跑的比谁都快
来源:互联网 发布:双矩阵博弈 编辑:程序博客网 时间:2024/05/04 04:14
树形DP+决策单调性
考虑优化DP。
构一条链的数据,打表,发现决策点单调,因此套决策单调性即可
知识漏洞,以前对决策单调性的理解一直存在误区。决策单调性是指对于 i < j,那么一定有i的决策点<=j的决策点,但并不保证决策函数是单峰的。因此不能直接从上一个决策点开始枚举,遇到不优就停下来。正确做法是主动转移,然后二分。详见《1D/1D 动态规划优化初步》里面的第一部分。
在树上的话,记录退栈就可以了。
话说这题好像数据很水,卡不掉错误算法?
#include<cstdio>#include<queue>#define N 100005#define cmin(u,v) ((u)>(v)?(u)=(v):0)using namespace std;namespace runzhe2000{ typedef long long ll; const ll INF = 1000000000000000000ll; int n, ecnt, p, a[N], last[N], stacnt, licnt; ll ans, f[N], pow[N]; struct edge{int next, to;}e[N<<1]; void addedge(int a, int b) { e[++ecnt] = (edge){last[a], b}; last[a] = ecnt; } struct stack { int u, p, from; }sta[N], list[N]; void dfs(int x) { if(x == 1) f[x] = 0; else { int l = 1, r = stacnt; for(; l < r; ) { int mid = (l+r+1)>>1; if(sta[mid].p <= x) l = mid; else r = mid - 1; } int u = sta[l].u; f[x] = f[u] + a[u] + pow[x - u]; } if(x == 1) sta[++stacnt] = (stack){x, 2, 0}; else { int u, p; for(;;) { u = sta[stacnt].u, p = sta[stacnt].p; if(x < p && f[x] + a[x] + pow[p-x] < f[u] + a[u] + pow[p-u]) list[++licnt] = sta[stacnt--], list[licnt].from = x; else break; } int l = max(x+1, p+1), r = n+1; for(; l < r; ) { int mid = (l+r)>>1; if(f[x] + a[x] + pow[mid-x] < f[u] + a[u] + pow[mid-u]) r = mid; else l = mid + 1; } if(l <= n) sta[++stacnt] = (stack){x, l, 0}; } bool end = 1; for(int i = last[x]; i; i = e[i].next){dfs(e[i].to);end=0;} if(end) cmin(ans, f[x]); if(sta[stacnt].u == x) --stacnt; for(; licnt && list[licnt].from == x; )sta[++stacnt] = list[licnt--]; } void main() { scanf("%d%d",&n,&p); for(int i = 1, x; i <= n; i++) { scanf("%d%d",&a[i],&x); x ? addedge(x, i),0 : 0; } for(int i = 1; i <= n; i++) { ll tmp = 1; bool fuck = 0; for(int j = 1; j <= p; j++) (tmp * i) < tmp ? fuck = 1 : tmp *= i; pow[i] = fuck ? INF : tmp; } ans = INF; dfs(1); printf("%lld\n",ans); }} int main(){ runzhe2000::main();}
0 0
- 【51NOD 1789】 跑的比谁都快
- 51Nod 1789 跑的比谁都快
- 【51Nod 1789】跑的比谁都快
- 【51Nod 1691】比大小
- 51 nod 1961 比大小
- 51nod 1355 斐波那契的最小公倍数 (数论+莫比乌斯反演)
- [莫比乌斯反演] 51Nod 1355 斐波那契的最小公倍数
- 51nod 1742 开心的小Q(莫比乌斯函数)
- 51nod 1355 斐波那契的最小公倍数 莫比乌斯反演+数学
- 51nod点头网-1240 莫比乌斯函数
- 51nod 1240 莫比乌斯函数
- 51nod--1240莫比乌斯函数 (数论)
- 51Nod-1240-莫比乌斯函数
- 51nod:1240 莫比乌斯函数
- 51nod-1240莫比乌斯函数
- 51nod 1240 莫比乌斯函数
- 莫比乌斯函数(51nod-1240)
- 51 NOD 1244 莫比乌斯函数之和(杜教筛)
- 小型企业实现安全保障的12步战略
- 玩转Unity资源,对象和序列化
- Jump Game -- LeetCode
- python中numpy与matlab的对应关系
- 服务器上搭建私有云--owncloud
- 51Nod 1789 跑的比谁都快
- 基础练习 回形取数
- 求阶乘小程序
- Windows batch 批处理常用命令列表
- mfc 搜索电脑所有可用串口数
- iOS 并发编程之 Operation Queues
- 数据结构的理解
- poj 1703
- 阶段测试总结java基础