GDOI模拟 20150806

本文解析了四道算法题:删数字、最短路径、病毒传播及屏保问题。介绍了每题的大意、解题思路及标准做法。删数字题采用单调队列;最短路径题使用宽度优先搜索;病毒传播题提出循环规律与快速幂法;屏保题通过线段树维护多项式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第一题 删数字

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

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

第二题 最短路

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

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

第三题 病毒传播

题目大意:村庄中共有M个人,编号为0M1,病毒症状只会持续一天,第二天开始的每一天,编号P 的人在以下条件下就会感染病毒:(ab)modM=P其中a为前一天感染病毒的某一个人的编号,b是其中一个病毒携带者的编号,病毒携带者即第一天感染病毒的人,ab可能相同),给出第一天感染病毒的人,问第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带入二次函数的解。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值