zoukankan      html  css  js  c++  java
  • 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

    咕咕咕咕

    如初见 与初见
  • 相关阅读:
    随机算法之舍伍德算法
    KMP算法笔记
    分治法求解最大子段和问题
    递归与分治之间的关系
    微信公众号开发学习笔记(一)
    关于echo$PATH中的PTAH来源
    【Leetcode】807. Max Increase to Keep City Skyline
    【Leetcode】804. Unique Morse Code Words
    【Leetcode】709. To Lower Case
    【Leetcode】Jewels and Stones
  • 原文地址:https://www.cnblogs.com/HISKrrr/p/13786674.html
Copyright © 2011-2022 走看看