GDOI模拟 20150806

第一题 删数字

题目大意:给你一个 n 个数组成的序列V,要你删除其中 k 个数,使得任意两数差值的最大值与任意两数差值的最小值的和最小。

我的思路:我先从小到大排序,我们要使得任意两数差值的最大值与任意两数差值的最小值的和最小,可得最后剩下的数一定是一个连续串。我用单调队列来维护差的最小值,而差的最大值可以O(1)算出。

第二题 最短路

题目大意:给出 N 个节点,M个含 K 个结点的完全子图,问从1走到 N 最小经过节点数。

其实这道题,宽搜就行了。

第三题 病毒传播

题目大意:村庄中共有M个人,编号为 0 M1,病毒症状只会持续一天,第二天开始的每一天,编号P 的人在以下条件下就会感染病毒: (ab) mod M = P 其中a为前一天感染病毒的某一个人的编号, b 是其中一个病毒携带者的编号,病毒携带者即第一天感染病毒的人,a b 可能相同),给出第一天感染病毒的人,问第k天感染病毒的人是哪些?
k 最大1e18

时限是两秒

我的做法:其实我在比赛的时候并没有想到正解,但是水了100分。我们可以发现我们设 a[i] 表示第 i 天感染病毒的人的集合,那么易得a一定会出现循环,而且我们可以知道当病毒携带者越多时,循环节越短。我就根据这个性质,前面大概 1.8 的时候找循环节,然后就根据循环来算出答案。

标准做法:我要求 a[k] ,我可以先求 a[k/2] ,然后把 a[k/2] 相乘,同理,我要求 a[k/2] ,我可以先求 a[k/4] ,然后把 a[k/4] 相乘,直到要求的为 a[1] ,乘回去就行了。

第四题 屏保

题目大意:要求维护由 n 个点((0,h1),(2,h2)...(n1,hn1)组成的折线, Q 组询问,要求支持单点修改,以及查询位于x=a直线下方以及折线上方的面积。
n ,Q<= 105

对于一对 h[i],h[i+1] ,围成的区域,可得, [0,min(h[i],h[i+1)) 对答案的贡献是一个常数, [min(h[i],h[i+1),max(h[i],h[i+1])] 对答案的贡献是一个二次函数, (max(h[i],h[i+1]),hmax] 对答案的贡献是一个一次函数。我可以用线段树来维护二次项,一次项,常数项系数,更改时,直接简单在树上加减系数,求答案是,用线段树求系数,再把 x <script type="math/tex" id="MathJax-Element-47">x</script>带入二次函数的解。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值