2018.12.08【NOIP提高组】模拟B组 比赛总结

本文是关于NOIP提高组模拟赛的总结,涉及多道算法题目,包括道路保留问题、进化序列计算和3x3网格机器人路径计数等。作者在解决过程中分享了思路与误区,如二分法的应用和动态规划的实现,同时对部分题目给出了解题策略。

题目

diyiti

Description

给定n 根直的木棍,要从中选出6 根木棍,满足:能用这6 根木棍拼出一个正方形。注意木棍不能弯折。问方案数。
正方形:四条边都相等、四个角都是直角的四边形。

Input

第一行一个整数n。
第二行包含n 个整数ai,代表每根木棍的长度。

Output

一行一个整数,代表方案数。

Sample Input

8
4 5 1 5 1 9 4 5

Sample Output

3

Data Constraint

对于20% 的数据,满足:n ≤ 30
对于40% 的数据,满足:n ≤ 200
对于60% 的数据,满足:n ≤ 1000
对于100% 的数据,满足:n ≤ 5000; 1 ≤ ai ≤ 10^7


保留道路

Description

很久很久以前有一个国家,这个国家有N个城市,城市由1,2,3,…,N标号,城市间有M条双向道路,每条道路都有两个属性g和s,两个城市间可能有多条道路,并且可能存在将某一城市与其自身连接起来的道路。后来由于战争的原因,国王不得不下令减小花费从而关闭一些道路,但是必须要保证任意两个城市相互可达。
道路花费的计算公式为wGmax{所有剩下道路的属性g}+wSmax{所有剩下道路的属性s},其中wG和wS是给定的值。国王想要在满足连通性的前提下使这个花费最小,现在需要你计算出这个花费。

Input

第一行包含两个正整数N和M。
第二行包含两个正整数wG和wS。
后面的M行每行描述一条道路,包含四个正整数u,v,g,s,分别表示道路连接的两个城市以及道路的两个属性。

Output

输出一个整数,表示最小花费。若无论如何不能满足连通性,输出-1。

Sample Input

3 3
2 1
1 2 10 15
1 2 4 20
1 3 5 1

Sample Output

30

Data Constraint

对于10%的数据,N≤10,M≤20;
对于30%的数据,N≤100,M≤1000;
对于50%的数据,N≤200,M≤5000;
对于100%的数据,N≤400,M≤50000,wG,wS,g,s≤1000000000。


进化序列

Description

Abathur采集了一系列Primal Zerg 的基因样本,这些基因构成了一个完整的进化链。为了方便,我们用A0,A1...An−1A_0,A_1...A_{n-1}A0,A1...An1 这n 个正整数描述它们。
一个基因Ax 可以进化为序列中在它之后的基因AyA_yAy。这个进化的复杂度,等于Ax∣Ax+1...∣AyA_x | A_{x+1}...| A_yAxAx+1...∣Ay的值,其中| 是二进制或运算。
Abathur 认为复杂度小于M 的进化的被认为是温和的。它希望计算出温和的进化的对数。

Input

第一行包含两个整数n,m。
接下来一行包含A0,A1...An−1A_0,A_1...A_{n-1}A0,A1...An1 这n 个正整数,描述这n 个基因。

Output

第一行包含一个整数,表示温和的进化的对数。

Sample Input

4 6
1 3 5 1

Sample Output

2

Data Constraint

对于30% 的数据,1 <= n <=1000。
对于100% 的数据,1 <= n<= 100000,0 <= m <= 2302^{30}230,1<= Ai<= 2302^{30}230


B

Description

给定一个3*3的网格图,一开始每个格子上都站着一个机器人。每一步机器人可以走到相邻格子或留在原地,同一个格子上可以有多个机器人。问走n步后,有多少种走法,满足每个格子上都有机器人。答案对109+710^9+7109+7取模。

Input

第一行包含一个整数n。

Output

输出一行输出走法的数量 Mod 109+710^9+7109+7

Sample Input

1

Sample Output

229

Data Constraint

对于40%的数据,1<=n<=10;
对于70%的数据,1<=n<=10^6;
对于100%的数据,1<=n<=10^18。


总结

这次完美炸车了。。。炸车了!!!
先读完了题目。
看完T1后,我十分懵逼地算样例;算完之后,发现这并没有什么用,遂弃之。
第二题看起来很easy,一看到是图,我就万分高兴;再看见“最小花费”,我就更高兴了,且自信了起来——二分答案啊!
于是我的思维就被二分带跑了,我于是打啊打啊,打了不同版本的代码:

0.0.0.1:先二分答案中的g,再二分s。打代码之前发现不行,遂升级;
0.0.0.2:先二分总花费,再二分答案中的g,运行代码时发现,遂跳跃式升级;
1.0.0.3:先二分总花费,再直接判定。可以先把每一条边的g和s分别乘上wG,wS,再把它们加起来。能用的边就是g+s<=mid的边。

打完后,发现跑不过样例啊!才发现这个方法有bug,提交后放弃了T2。
T3是我认为最水的题目了。
我们只用求出一共有几个满足复杂度小于m的序列就可以了。
找序列,不难想到枚举起点,再用log的算法找终点。但这道题目不能用前缀和,我就想到了RMQ
fi,jf_{i,j}fi,j表示以 i 为起点,长度为2j2^j2j的序列的复杂度。
接着就像倍增那样做就可以了。
我于是很快很快地打完交代码,交完之后才发现这个代码漏洞百出。
改了整场比赛,还是没改出来(我以为改出来了!!!),于是爆0了。
T4让我不知所措,想打表找规律,却发现连暴力都不会打!!!

题解

T1

可以考虑怎么把6条木棒分成4份。
显然只有3 1 1 1(一组由3根拼接得到,其余都是相等的木棒)和2 2 1 1这两种方法。
为了方便操作,开一个桶b,bib_ibi表示有多少根长度为 i 的木棒。
先枚举相等的三边对应的长度,设为x(bx≥3b_x\geq 3bx3)那么此时的方案数显然是Cbx3C_{b_x}^{3}Cbx3
剩下那三根木棒的和为x。可以开一个桶a,aia_iai表示由两根木棒拼接而成的总长度为 i 的方案数,可以n2n^2n2预处理出来。可以先枚举那三条木棒中的一条,设它的长度为y(y<x−1y<x-1y<x1),那么剩余两条的总长度就为x−yx-yxy,方案数为ax−ya_{x-y}axy。但是这样会重复,可能会出现长度为y的木棒出现了2次的情况。这种情况的方案是ax−2ya_{x-2y}ax2y
综上所述,方案数应为Cbx3(ax−y−ax−2y)C_{b_x}^{3}(a_{x-y}-a_{x-2y})Cbx3(axyax2y)
另外,y=x3y=\frac{x}{3}y=3x的情况要特判一下,而总的方案数也要除以3(因为其它三边都会被重复计算)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值