CSP 模拟12


考崩了……

T1 : 松鼠的新家

裸的树上差分
这题没A 建议我重读一年级
HZOI 20个切掉
每次将两个点之间的简单路径上所有点权值加一 两点的差分数组加一 lca减一 fa[lca]减一就完了







T2 : trade

30pts :
大力搜索dfs \(2^n\) 枚举就有30pts了


70pts :
ntdp 随便搞搞就出来了
感觉似乎比30pts还好想
定义dp[i][j]表示前i天 剩下j个物品的最大价值 然后答案就是dp[n][0] (可以证明dp[n][0] 一定是最优的)


100pts:
一开始考试的时候想的是优化dp
但是是反悔贪心
一个物品如果买了 一定以后会卖 而且卖的地方比这个地方更优
如果A处买 B处卖 获得价值为 \(val_b\) - \(val_a\)
考虑一个新的地方C
如果C处卖掉比B处卖掉更优 那就把该物品在C处卖掉 同时把B处物品解放 即假装买了B 因为B处不需要卖掉东西就可以买了 (如果真的需要用就把B买了)
可以用小根堆维护一下
每次取之前状态中的最小值 如果在当前位置卖掉是最优的 那就在当前位置卖掉 同时把之前的物品解放
实现有点难想
每读入一个物品都把它push进小根堆 然后让ans减去它的价值 表示买了这个物品 如果当前位置的价值比小根堆堆顶更大的话 就把当前位置push进小根堆 然后弹出堆顶 (假装买了当前物品 同时解放之前的物品)
最后把小根堆清空 然后ans每次加上小根堆的价值就好了


瞎搞: 显然我们不会把所有物品都买了然后一个不卖
如果买了一个物品一定以后会卖掉
所有我们最后最多只会买一半的商品
而且存最多存一半
即前一半只买不卖 后一半只卖不买
第二维上界只设置到500 然后跑到最后 可以保证前70pts到手而且或许可以骗到点分(数据加强之前是可以A掉的)







T3 sum:

数学题
考试的时候打了80pts
几个柿子挺显然的 随便推推
然后考虑怎么优化










优化不了
……
但是发现可以离线
所以就用莫队跑呗 然后就能过了





T4 building

咕咕咕咕

posted @ 2020-10-09 16:55  HISKrrr  阅读(100)  评论(1编辑  收藏  举报