csust 第五次周赛题解 (代码待更新)

A 红黑树

最后得到的字符串只有两种情况
1.brbrbrbrbrb s1
2.rbrbrbrbrbr s2
所以我们只要把这两种情况的操作数算出来取较小的

具体怎么算呢
假设 该位为 b 并且 s1为 r cntb++
该位为 r 并且 s1为 b cntr++
操作数就为 max(cntb,cntr);
s2 同理

B厂里吃鸡王 (多源最短路)

题意:
大概就是你降落在任意一个点,求所有的k种装备到你的最短距离。通俗一点就是,你从起点出发,找到离你最近的装备1,然后传送回起点(传送不需要花费),接着找装备2…(菜鸡的我看了半天才懂)

看完这个题 我最原始的思路是 枚举这n个点,每个点跑一次最短路,然后在一件一件装备的取最小值(这样肯定会t)
然后看完lcjdl的题解,和听他解释了好久,我才知道这个怎么写。
我们观察到 装备数量最多就 100 种,那么我们可不可以把每种装备的点看成一个点,然后求这个点到所有1—n 的点的最短路呢。这样最多就是求 100次最短路了。

怎么把装备相同的点看成一个点呢 我们构造一个点(n+1),然后让这个点和所有装备为 i 的点 建立一条长为0的边,对n+1点跑最短路,就能达到想要的结果了,画个图看看应该就知道了。

C.战域(优先队列)

首先初始值相同 也就是都是0次的时候是有一个初始值的,这里很容易错。然后就把第1次的花费减去第0次的花费放到优先队列里。然后一个一个取出来 更新答案 更新花费(第x+1次减第x次)后放回去就好了,循环m次。

D 摆蔬菜2(二分)

先了解一下那啥 n包蔬菜的组合有 (2^n)-1;
然后我们就对重量排个序
从头开始 对每一包蔬菜找最大的合法区间 区间长度len
所以 答案就是 ans+=(2^len)-1;
这样当然是不太对的 因为我们算了很多重复的。所以每次加的时候 还要减去前面算过的。
举个例子 :
6 7
2 4 5 5 10 11
对 2 找合法区间 就是 [2 4 5 5] ans+=2^4-1;
对 4 找合法区间 就是 [4 5 5 10 11] ans+=2^5-1,但是[4,5,5]上一次已经算过了 所以ans -=2^3-1;
这时候 已经到达最右端了 直接 break .(可以想想为什么)
ps:注意减法取模(比赛的时候我就没注意,还好最后几十秒发现了,很刺激) 找合法区间记得二分 了解一下lower_bound

补充 一下 这题我其实想复杂了,听了大佬们的建议,可以简化操作:
同样是枚举每一个点 找最大合法区间,不同点在于计算:
对于 [2 4 5 5] 我们可以一定把2包括在子区间内 这样就变成了算 [4 5 5] 的可以为空的子集 也就是 2^(4-1);
所以答案就是 ans+=2^(len-1) 是不会重复的

E 摆蔬菜1

听学长说是 单调队列 (我貌似还不会)
我是用 rmq+二分 写的

和上题类似 对每个点向右找最大合法区间 (应该是有单调性的)然后利用前缀和更新答案就好了
难点就在于怎么二分吧 我就先不放代码了

发布了11 篇原创文章 · 获赞 1 · 访问量 386

猜你喜欢

转载自blog.csdn.net/hddddh/article/details/105030954