【ACM-ICPC 2018 焦作赛区网络预赛】 A.B.F.G.H.I.J.K.L题解


A. Magic Mirror
按照题意模拟即可。
A题代码
https://paste.ubuntu.com/p/pTcD94cpRD/


I. Save the Room
类比到二维平面,若一个矩形想被1*2的矩形填满,长宽至少有一个为偶数
I题代码
https://paste.ubuntu.com/p/wcnrzKSXN9/


G. Give Candies

n1C1n1C2n1....n1Cn1n1 将题意换个方式理解就是给你n个1,在中间插板,问得到的不同方案数。当插入一个板时,方案数为 C n − 1 1 ,当插入两个板时,方案数为 C n − 1 2 . . . . 插入 n − 1 个板时,方案数为 C n − 1 n − 1

ans=Σn1i=0Cin1=2n1 方案总数 a n s = Σ n − 1 i = 0 C n − 1 i = 2 n − 1

于是这道题就转换为当n很大的时候求 2n1 2 n − 1 , 我们只需要用欧拉降幂公式对 n1 n − 1 进行降幂即可
ABmodC=ABmodφ(C)+φ(C)modC 欧拉降幂公式: A B m o d C = A B m o d φ ( C ) + φ ( C ) m o d C

G题代码
https://paste.ubuntu.com/p/2qYPS24vcB/


L. Poor God Water
根据题意可以暴力打出前20项,然后丢进BM就可以得到递推式
f[i]=2f[i1]1f[i2]+3f[i3]+2f[i4] f [ i ] = 2 ∗ f [ i − 1 ] − 1 ∗ f [ i − 2 ] + 3 ∗ f [ i − 3 ] + 2 ∗ f [ i − 4 ]
没有BM的话可以手推9*9的转移矩阵或者在AC自动机上跑出转移矩阵。
L题代码
https://paste.ubuntu.com/p/3wBgtFbSNz/


K. Transport Ship
题意就是给你 n n 种物品,第i种物品有 2c[i]1 2 c [ i ] − 1 个,每个所占容量为 v[i] v [ i ] ,求凑出容量为S的方案总数
我们知道多重背包可以二进制优化,而且这道题已经给出二进制最大值是多少,那么就是所有小于C的2次幂进行01背包,转移的时候就是正常01背包的转移,只不过不是取像求最大价值时一样取max,而是直接加上可以转移过来的方案数。
K题代码
https://paste.ubuntu.com/p/VwcWJZ8XVT/


B. Mathematical Curse
题意就是给你一串运算符和一个初始值,你要按顺序使用这些运算符与一个序列中的数进行运算,序列中数的个数大于运算符的个数,要按先后顺序使用这些数而运算符,当然也可以选择不用某个数,但最后一定要把所有运算符用光。
我们用dp[i][j]表示到达第i个位置是使用j个运算符所能达到的最大值,然后就可以n*m进行转移,但是这道题过程中会出现负数,如果一个负数进行乘法,很明显我们应该用更小的负数去乘负数才能得到一个更大的数,所以我们只要开两个dp数组,一个保存最小值,一个保存最大值,乘法和除法的时候分别互相进行转移就可以了。
B题代码
https://paste.ubuntu.com/p/fZsybckMHd/


J. Participate in E-sports
题意简化之后就是分别判断n和n*(n-1)/2是否为完全平方数,但这里n很大,为了保证精度要java手写二分。而且我们发现满足第二种情况的完全平方数不太多,而且具有递推式,为了卡时间我们就可以二分判断n,打表判断n*(n-1)/2
J题代码
https://paste.ubuntu.com/p/ynSWTxb5Mf/


H. String and Times
题意就是求一个字符串内出现次数大于等于a,小于等于b,的子串个数。
SAM可以求出一个字符串出现任意次数的子串个数,所以就是裸裸的SAM模板题。
H题代码
https://paste.ubuntu.com/p/YzCVq6MWJp/


F. Modular Production Line
区间K覆盖模型,用费用流解.只是这题 N N 可达1e5,需要将点离散化.(网络流复杂度 o(v2E o ( v 2 E ) )
建模方式步骤:
1.对权值为 w w 的区间[u,v],加边 id(u)>id(v+1) i d ( u ) − > i d ( v + 1 ) ,容量为1,费用为-w;
这样最后的结果取反就是最大值
2.对所有相邻的点(离散化之后的点)加边 id(i)>id(i+1) i d ( i ) − > i d ( i + 1 ) ,容量为正无穷,费用为 0 0 ;
3.建立源点汇点,由源点s向最左侧的点加边,容量为K,费用为0,由最右侧的点向汇点加边,容量为K,费用为0
4.对于这种涉及到点覆盖的问题,单个点有使用次数,一般需要 u>v+1 u − > ( v + 1 ) 建边,这样能够避免区间点重合
5.跑出最大流后,最小费用取绝对值就是能获得的最大权
F题代码
https://paste.ubuntu.com/p/35krW6bdXN/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值