Loading

2020.10~2020.12 做题记录

目录

  1. P1966
  2. P1450
  3. P2627
  4. P5228
  5. P7075
  6. [算法] 三分法
  7. CF1440C2
  8. AcWing125
  9. [算法] Lucas 定理
  10. [算法] 高斯消元
  11. P2455
  12. [算法] 矩阵加速
  13. P1438
  14. P4933
  15. UVA1660
  16. P7114
  17. P6619
  18. P2764
  19. P2774
  20. P2766
  21. P4001
  22. P4014

正文

P1966 火柴排队 | 逆序对

一开始想了个错的离散化,后来看了题解,悟了好久才明白。
定义 \(f[i],g[i]\)\(a\)\(b\) 中第 \(i\) 大的数的下标。显然,最优的情况是 \(a\) 中最大的对应 \(b\) 中最大的,第二大的对应第二大的……据此,可以固定 \(a\) 调换 \(b\) 的位置使得满足一一对应。此时需要的最小交换次数即为从 \(1\dots n\) 转换到目标状态(一一对应)的次数,即目标状态的逆序对数。

P1450 [HAOI2008]硬币购物 | 动态规划、容斥原理

首先可以预处理出不限制硬币数量的方案数,价值为 \(s\) 时的方案数记作 \(dp[s]\)
于是,可以先考虑不做限制,即 \(ans=dp[s]\)
然后第一种到第四种硬币可能会有不合法的。不合法的方案一定是选了 \(d[i]+1\) 个及以上,因此 \(ans-=dp[s-(d[i]+1)*c[i]]\)。这样会减重,所以要加上两种不合法的方案数,以此类推。

P2627 [USACO11OPEN]Mowing the Lawn G | 动态规划、单调队列

\(dp[i]\) 为以 \(i\) 为结尾的最大效率总和。容易发现两个奶牛区间之间至多隔着 \(1\) 个奶牛。于是 \(dp[i]=\max\limits_{i-k-1\le j \le i-2}\{dp[j]-s[j+1]\}+s[i]\)。典型的 1D/1D 动态规划问题,单调队列优化一下即可。

P5228 [AHOI2013]找硬币 | 动态规划

首先能注意到选硬币时越大越好。于是设 \(dp[i]\) 为最大的硬币为 \(i\) 时,买所有兔子用的硬币数。这时候枚举因数会有点麻烦,所以考虑刷表法:\(dp[ij]=dp[i]-j*minus+minus\),其中 \(minus\) 为新增价值为 \(ij\) 的硬币后,减少的需要的硬币数量。\(-j*minus\) 代表原来需要的硬币数,而 \(minus\) 为现在需要的硬币数。

P7075 儒略日 | 模拟、二分

二分年份,然后暴力枚举日期。

Tricks:

  1. 二分时顺便求出年份(年份不与 \(l,r\) 相同):
while(l<=r){
	mid=(l+r)>>1;
	if(Days(mid)<=a[i]){
		year=mid;
		l=mid+1;
	}else{
		r=mid-1;
	}
}
  1. 平移年份,把公元前的年份往后平移一年,就不用考虑公元 \(0\) 年了。

  2. \((a+b-1)/b\) 来计算 \(\lceil \frac{a}{b} \rceil\)

P3382 [算法] 三分法

scanf("%d%lf%lf",&n,&L,&R);
Dec(i,n,0) scanf("%lf",&a[i]);
double l=L,r=R,lmid,rmid;
For(kase,1,1000){
	lmid=(l+r)/2;rmid=min(lmid+1e-6,r);
	if(F(lmid)<F(rmid)) l=lmid;
	else r=rmid;
}
printf("%.5lf",l);

中间的 \(rmid\)\(lmid+10^{-6}\) 是因为题目要求精度为 \(10^{-5}\),而 \(eps\) 要设为精度 \(\times0.1\)

CF1440C2. Binary Table (Hard Version) | 构造

与官方题解不一样的做法:首先,操作次数不超过 \(nm\) 次,因此可以对于每个点做一次操作。发现对于每个 \(2*2\) 的小方块,总是能够在 \(4\) 次之内变成全 \(0\)。若 \(n\) 为奇数或 \(m\) 为奇数,则通过调整把多出来的一行或一列变成全 \(0\),然后对于每个 \(2*2\) 的方块处理一下即可。

代码:https://codeforces.com/contest/1440/submission/98775815

AcWing125. 耍杂技的牛 | 贪心

考虑证明邻项交换后不优。

假设已经排好序,则交换之前相邻的牛的答案为 \(\max\{w_1+w_2+\dots+w_{i-1}-s_i,w_1+w_2+\dots+w_i-s_{i+1}\}\),交换后答案为 \(\max\{w_1+w_2+\dots+w_{i-1}+w_{i+1}-s_i,w_1+w_2+\dots+w_{i-1}-s_{i+1}\}\)。都减掉 \(w_1+w_2+\dots+w_{i-1}\)\(\max\{-s_i,w_i-s_{i+1}\},\max\{w_{i+1}-s_i,-s_{i+1}\}\)。则此时 \(w_i-s_{i+1}\) 一定大于 \(-s_{i+1}\)。所以只需要让 \(w_i-s_{i+1}>w_{i+1}-s_i\),交换前就一定大于交换后的答案了。

解此不等式得 \(w_i+s_i>w_{i+1}+s_{i+1}\)。等价于当所有 \(i\) 满足 \(w_i+s_i<w_{i+1}+s_{i+1}\) 时,不交换最优。

P3807 [算法] 卢卡斯定理

公式:若 \(p\) 为质数,则 \(C_n^m=C_{n/p}^{m/p}\times C_{n\bmod p}^{m\bmod p} \bmod p\)

求阶乘时只需要求到 \(p\)。当 \(m>n\) 时,\(C_n^m\) 应返回 \(0\)

P3389 [算法] 高斯消元

我用的是高斯-约旦消元。对于无解和多解的判断参考这篇题解:https://www.luogu.com.cn/blog/105254/solution-p2455

如果答案里出现 \(-0.00\) 之类的东西,需要加一个 \(eps\),即 \(ans+eps\),能消掉负号。

P1939 [算法] 矩阵加速

注意数组如果从 \(1\) 开始,赋值的时候二维数组要在前面加一个 \({0,0,0}\)

P1438 无聊的数列 | 线段树、差分

用线段树维护差分数组,对于每一个区间 \([l,r]\) 加等差数列 \((k,d)\) 的操作,转换为以下伪代码:

a[l]+=k;
if l!=r: a[(l+1)...r]+=d;
if r!=n: a[r+1]-=k+(r-l)*d;

询问 \(p\) 的值时输出 \(a[1...p]\) 的和即可。

P4933 大师 | 动态规划

比较简单的动态规划,但要注意统计答案的时候不要重复统计。

UVA1660 电视网络 | 最小割、点边转化

对于每个点 \(x\) 连边 \((x,x+n,1),(x+n,x,\inf)\),对于每条边 \((x,y)\) 连边 \((x+n,y,\inf),(y+n,x,\inf)\)

注意以上所有边 \((u,v)\) 都有一个 \((v,u,0)\) 的反向边。

P7114 字符串匹配 | 字符串哈希、树状数组

首先是 \(84\) 分做法:预处理 \(\mathbb{suf}\) 表示后缀的 \(F\)。枚举 AB,然后用字符串哈希判断最远能延伸到哪里,再计数一下就行了。

考虑用树状数组在线记录小于等于 \(suf_i\) 的前缀个数。时间复杂度降为 \(O(Tn(\log n+\log 26))\)

P6619 冰火战士 | 树状数组、倍增

\(ice\) 为冰方在满足当前温度下的能量和,\(fire\) 为火方的。

发现答案为 \(\min(ice,fire)\)。于是可以在树状数组上倍增临界温度 \(t\),使得温度取 \(t\)\(ice\le fire\),而温度取 \(t+1\)\(ice>fire\)。然后答案取这两部分的最大值即可。注意如果温度取 \(t+1\) 答案最大,则 \(t+1\) 不一定是最优温度。

对于最后 \(10\%\) 的数据,离散化一下即可。

时间复杂度 \(O(n\log n)\)。常数较大。

P2764 最小路径覆盖问题 | 二分图最大匹配、网络流

构造二分图 \(G\) 并求其最大匹配即可。

在枚举边并维护并查集时,只需要枚举正边或反边,因为正边和反边的流量一定不相同(一个是 \(0\) 那么另外一个一定是 \(1\))。

直接维护并查集、枚举 \(fa[i]==i\) 的做法似乎只在所有边 \((u,v)\) 都有 \(u<v\) 时正确。

P2774 方格取数问题 | 最大流、最小割

先全选,然后把互斥的点之间连边,跑最小割最后减掉即可。

P2766 最长不下降子序列问题 | 最大流

求出以 \(i\) 为开头的最长不下降子序列长度 \(f_i\),然后对于每对 \((i,j)\) 满足 \(i<j,a_i\le a_j\)\(f_i=f_j+1\) 连边。

然后跑最大流就行了。

P4001 [ICPC-Beijing 2006]狼抓兔子 | 平面图最小割

平面图最小割转对偶图最短路即可,感性理解一下就可以发现是对的。

P4014 分配问题 | 费用流

费用流模板题。

posted @ 2020-10-29 19:04  Alan_Zhao_2007  阅读(47)  评论(0)    收藏  举报