【题解】牛客NOIP暑期七天营-普及组2

A.蘑菇

由于初始蘑菇数是0,根据题意答案应该等于所有蘑菇数量为偶数的采集点的蘑菇数量之和。

所以如果有蘑菇数量为奇数的采集点,就使其中数量最多的加一,如果没有就不使用魔法,然后把所有数量为偶数的采集点数量加起来就是答案。

B.括号

20分,暴力枚举。

40分,暴力搜索。

对于所有的数据都可以直接贪心计算,

循环一次可以算出能够直接消除掉的括号对,设为x。如果将他们全部消除,括号串中任何一个’)’之前都不会有’(’,任何一个’(’之后也不会有’)’,即”))...)(((...(”的形式。我们设此时还有a’(’b’)’,按照贪心的方法,一个”((”的子串可以通过”((”->”()”->“”的方法使用两次操作消除,同理”))”也可以通过两次操作消除,”)(”则要通过三次操作消除。所以如果a,b都是偶数,则答案为a+b+x

如果a,b都是奇数,则答案为(a-1)+(b-1)+3+x,a+b+x+1.

整个过程可以在O(n)的复杂度内求解。

C.硬币

50分的数据使用特判&枚举可以通过。

100分:

可以O(m)线性算出来

要使用概率dp也可以。

时间复杂度O(n*m)

没有卡时间,需要使用滚动数组,否则部分样例可能超内存

D.线段

8分,暴力枚举查询和线段和颜色

36分,同样暴力枚举,可能需要离散化颜色,否则有超时的可能。

60分,考虑n,m2e5的情况,如果每条线段颜色不同,题目即转化为区间内有多少条完整线段的问题,关于此问题,将线段和查询分别按右端点从小到大排序,依次加入这些线段的左端点并查询区间内包含多少个线段的左端点,因为当前加入的线段的右端点均小于等于当前查询的右端点,区间内左端点的数量就是完整线段的数量。如果颜色只有一种,那么只需要判断数量是不是0,更简单。

80分,由于颜色仅有30种,按照之前的方法加上用线段树可查询区间内有多少种不同颜色的左端点。按位维护颜色即可。

100分:同样对线段和查询排序然后离线处理,不同的是每种颜色只需要贪心的维护当前最右端的端点,也就是对两条颜色相同的线段,如果都插入过,则清除掉左端点靠左的线段,只保留最右端的端点。这里包含贪心的思想,因为查询区间的r固定,如果能包含一个更左的左端点,那么当前的左端点也一定能被包含,而每种颜色只保存一个端点可以使得每种颜色并不会被重复计算,如此,也只需要计算区间内的左端点数量。使用树状数组或者线段树均可。

STD供参考:


全部评论
@FILARET 大概是这么个样子,和dp还比较像。貌似方法还不止一种
点赞 回复
分享
发布于 2019-08-20 13:58
C题O(m)怎么线性推呢?
点赞 回复
分享
发布于 2019-08-20 12:56
滴滴
校招火热招聘中
官网直投
50分特判指的是奇数位且最高位大于7吧,反正特判没拿多少分
点赞 回复
分享
发布于 2019-08-20 13:40
分享一下本蒟蒻的期望dp做法: 表示在第i步有j个硬币面朝上的概率,显然有。 转移方程: 最后的答案就是。
点赞 回复
分享
发布于 2019-08-20 20:02
还有T4有在线做法吗?
点赞 回复
分享
发布于 2019-08-20 20:20
给一个C的线性做法= = 设f[i]表示前i次翻转的期望 显然f[0]=a 然后我们对i>=1 显然f[i]=f[i-1]-f[i-1]/n+(n-f[i-1])/n
点赞 回复
分享
发布于 2019-08-21 23:03

相关推荐

6 3 评论
分享
牛客网
牛客企业服务