zoukankan      html  css  js  c++  java
  • 杂题记录

    题目

    以下题解里面要是有不对的地方欢迎提醒/打脸。

    [WC2006]水管局长

    题面:

    [WC2006]水管局长

    题解:

    首先根据一些常识,我们可以发现,符合要求的边一定在最小生成树上,因为有删边操作,因此我们需要做的就是动态维护最小生成树。
    因为删边不好处理,因此我们可以直接倒着处理,这样删边就变成加边了。
    因为要维护边,因此我们考虑将每条边都视作一个带权中转点。即对于x --- > y的边,连x ---> now --- > y,其中now为一个带权点。
    同时如果已经构成一棵树,我们要再往里面塞边的话,就必须要删掉一条边,否则会构成环。
    因此对于一条连接x ---> y,边权为(k)的边,我们查询x -- > y路径上边权的最大值(maxn),那么会有2种情况:

    • (maxn > k),那么说明插入这条边是优的,因此我们删去最大值所代表的边,加入当前边
    • (maxn le k),那么说明保留最大值比较优,所以我们忽略这条边,不进行修改。

    然后就可以了。

    [FJOI2015]火星商店问题

    题面

    [FJOI2015]火星商店问题

    题解

    观察到,如果没有最近d天的限制,那么我们只需要将所有物品按照所属商店的顺序加入可持久化trie树。
    如果我们要查询商店编号在([ll, rr])之间的最大xor值,那么我们只需要查询区间([l, r])内的xor最大值即可。
    其中(l)表示第一个属于查询范围内的物品编号,(r)表示最后一个属于查询范围内的物品编号。
    具体如何获取这2个编号?因为物品是按照所属商店顺序加入的,所以我们只需要在加入的物品序列中二分一下就可以了。
    那么再考虑最近d天的限制。
    相当于是查询商店编号属于([ll, rr]),时刻属于([l, r]) 内的最大xor值。
    我们考虑线段树分治。
    对于每个询问区间,我们将它的查询时刻区间分成log段,挂在线段树上。
    对于每个物品,因为我们需要将物品按照所属商店的顺序加入,因此对于线段树上的每个区间,我们都需要重建整个可持久化trie树。
    不过因为物品是一个单点修改,因此就算我们在每个包括了这个物品的区间都放一个这个物品,每个物品也最多放log个。
    因此我们在每个包括了这个物品的区间内放一个这个物品,然后每到一个区间,就取出所有在这个区间内出现过的物品,重建整棵trie树。
    然后对于每个挂在这个区间上的询问,二分我们需要查询的物品区间,在可持久化trie树上查询并更新这个询问的答案。
    最后再输出即可。
    复杂度是(O(nlog^2n))

    [USACO13OPEN]阴和阳Yin and Yang

    题面

    [USACO13OPEN]阴和阳Yin and Yang

    题解

    看上去点分搞搞就可以了?

    [51nod]1472 取余最大值

    题意

    有一个长度为n的数组a,现在要找一个长度至少为2的子段,求出这一子段的和,然后减去最大值,然后对k取余结果为0。
    问这样的子段有多少个。

    题解

    之前做过这题的树上版本,可以直接套上来做。
    我们考虑点分治,因为拼接2条路径时需要知道最大值是谁,所以不能直接做完个子树就放桶。
    我们考虑容斥,先求出所有的路径,按照max从小到大排序,然后每枚举到一条线段,就减去max然后在桶里面找方案,再加入桶。
    但是这样会有重复,因此我们单独求出每棵子树内部互相匹配的方案。然后用总方案减去这部分,就得到了答案。

    CF1137C Museums Tour

    题面

    一个国家有 (n) 个城市,通过 (m) 条单向道路相连。有趣的是,在这个国家,每周有 (d) 天,并且每个城市恰好有一个博物馆。
    已知每个博物馆一周的营业情况(开门或关门)和 (m) 条单向道路,由于道路的设计,每条道路都需要恰好一个晚上的时间通过。你需要设计一条旅游路线,使得从首都:(1) 号城市开始,并且当天是本周的第一天。每天白天,如果当前城市的博物馆开着门,旅行者可以进入博物馆参观展览,否则什么也做不了,这一天的晚上,旅行者要么结束行程,要么通过一条道路前往下一个城市。当然,旅行者可以多次经过一个城市。
    要求让旅行者能够参观的不同博物馆数量尽量多(同一个城市的博物馆参观多次仅算一次),请你求出这个最大值。

    题解

    如果我们对原图缩点会怎样?
    每个强联通分量的贡献会随着进入的时间而改变。
    考虑到(d)不大,可以考虑将每个城市拆成(d)个单独的点,((x, i))表示点(x)在星期i的状态,再用((x, i)) ---> ((x, i + 1)),然后再缩点。
    那么我们会发现,一旦我们可以到达一个点,并且((x, i))是开启状态,那么我们一定可以获得这个贡献,因为我们走(k)到达的,一定是某个城市的第(k)个状态。因此我们就可以在新图上直接跑最长路了。

  • 相关阅读:
    利用avalon 实现一个简单的成绩单
    有关less 处理@arguments的一些高级技巧
    迷你MVVM框架 avalonjs 0.9发布
    IE9-10 option BUG
    判定元素正在插入到DOM树——DOMNodeInsertedIntoDocument
    迷你MVVM框架 avalonjs 0.85发布
    机器学习研究与开发平台的选择
    JS生成指定范围内的随机数(支持随机小数)
    DDD领域驱动设计 ---- 系列文章
    序列化效率比拼——谁是最后的赢家avaScriptSerializer方式、DataContract方式、Newtonsoft.Json
  • 原文地址:https://www.cnblogs.com/ww3113306/p/10434283.html
Copyright © 2011-2022 走看看