竞赛刷题记录


2019.10.01

p1098 字符串的展开  模拟
p1023 税收与补贴问题  模拟
p1068 分数线划定  排序

2019.10.02

p1309 瑞士轮  排序 ————> 归并思想,分胜负两组进行合并
p1093 奖学金  排序 ————> 快排,熟悉cmp用法
p1012 拼数  排序 ————> 快排,字符数组排序
p1090 合并果子  贪心 ————> 堆排,可以用标准模板库STL

2019.10.03

p1080 国王游戏  贪心 ————>  数学推理,结合高精度(高精*单精,高精/单精)
p1019 单词接龙  DFS
p1040 加分二叉树  区间dp ————>  [https://www.luogu.org/problemnew/solution/P1040](https://www.luogu.org/problemnew/solution/P1040)
 - [ ] 另解:树形dp,以后再学,,

p1092 虫食算  DFS ————>  疯狂剪枝,太难了,心痛

2019.10.04

p1443  马的遍历  BFS  ————>  模板题,注意输出格式和数组大小
p1126  机器人搬重物  BFS ————>  考虑bfs每一步应该是相同花费,平等的往外扩展
p1118  数字三角形  DFS ————>  比较简单的剪枝
p1141  01迷宫  BFS  ————>  求连通块,bfs队列不需要memset
p1434  滑雪  DFS  ————>  求最大长度,dp思想

2019.10.05

p1226  快速幂(模板)分治
p1908  逆序对  分治 ————>  归并排序

2019.10.06

p1316  丢瓶盖 二分 ————>  最小值最大
p1182  数列分段  二分 ————>  最大值最小
p1020  导弹拦截  dp ————>  线性dp,最长不上升子序列,n^2 (还有nlogn的超强做法,以后再说)
p1091  合唱队列  dp ————>  线性dp,左右分别球最长上升子序列
p1280  尼克的任务  dp ————>  线性dp,从后往前搜

2019.10.08

P1880  石子合并  dp ————>  区间dp,f[i][j] = max(f[i][k] + f[k+1][j] + d(i,j))
		在考虑如何递推时,通常考虑如下几个方面:
		是否能覆盖全部状态?
		求解后面状态时是否保证前面状态已经确定?
		是否修改了已经确定的状态?

2019.10.11

p1462  通往奥格瑞玛的道路  最短路 ————> spfa+二分
p3366  最小生成树(模板)kruskal
p3367  并查集(模板)

2019.10.21

Codeforces Round #587 (Div. 3)
A	Prefixes 水题
B	Shooting 水题
C	White Sheet 水题
D	Swords 水题
E	Numerical Sequence (easy version) ————> 数学方法(分段,等差数列)+二分
F

2019.10.22

Codeforces Round #590 (Div. 3)
A	Equalize Prices Again 水题
B	Social Network ————> 双向队列,离散化
C	Pipes ——> 水题
D Distinct Characters Queries
	题意:给你一个字符串,然后有两个操作
		  1 a b   把字符串中a 位置的字符 替换成b
		  2 a b 查询字符串中 a - b区间中不同字符的种类数
	思路:方法一:(树状数组)可建立26个树状数组,对应着26个字符所代表个数的前缀和,进行2操作时只需要进行26次循环查询对应区间有无这个字符即可,若有sum++
		  方法二:(set)set存储字符所对应的字符的下标。然后2操作时,进行26次循环,看每个字符set中,有没有一个数在 区间内即可。
		  方法三:(线段树,位运算)每一位都取往左移当前对应的数字(b:1<<1,  d:1<<3),从叶子结点往上结点为子节点的或运算。

2019.10.22

Codeforces Round #595 (Div. 3)

A	Yet Another Dividing into Teams 水题

B	Books Exchange ————>并查集求连通块大小,或 dfs

C	Good Numbers (hard version) 
	题意:求大于n的m,m有不同的3的次幂。
	思路:先把 n 内所以3的不同次幂减去,保存在一个ans里面,然后从小到大找一个找出没使用过的3的次幂,使它大于n,加入答案。

D	Too Many Segments (hard version)
	题意:给定n个线段,线段可以相交,第i个线段覆盖的区间为[li,ri],问最少删除多少个线段让覆盖每个点的线段数量小于等于k。
	方法一(贪心+树状数组):从左往右扫每个点x,若覆盖点x的线段数cnt大于k,则贪心的删去覆盖点x的线段中ri前cnt?k大的线段,因为点x左边的点的被覆盖数一定已经小于等于k了,删去ri越大的线段越优。可以用个堆来维护覆盖点x的线段,用树状数组维护覆盖每个点的线段数量。
[https://www.cnblogs.com/xyq0220/p/11731632.html](https://www.cnblogs.com/xyq0220/p/11731632.html)
	方法二(set+vector):将所有线段用set维护,然后从小到大枚举端点,将左端点覆盖到这个点的线段加入set中,当线段的数量大于k,移出r最大的线段,最后将右端点等于这个点的线段全部移出;
[https://www.cnblogs.com/Carered/p/11730926.html](https://www.cnblogs.com/Carered/p/11730926.html)

E. By Elevator or Stairs?
	题意:n层楼,a[i] (0

2019.10.24

Codeforces Round #596 (Div. 2)

A	Broken Keyboard 水题

B	Binary Palindromes 水题
	题意:给n个01序列,可任意交换,求可构成回文序列的最大数量
	思路:若一个序列的0或1为偶数,则自身可以构成回文序列,只需处理0和1均为奇数的情况;若0和1均为奇数的串为偶数,则答案为n,若为奇数,则答案为n-1
	
C	Minimize The Integer  水题
	题意:一个数字序列,相邻的奇数偶数可以交换,求交换后的最小值0709->0079	
	思路:奇数偶数相对顺序不变,故将奇数偶数分成两个序列,依次输出较小值

D	Salary Changing	水题
	题意:有N名员工和S元钱,然后我们想知道在每一名员工有薪资要求在[li, ri]的情况下,我们如何在总共就S元钱的情况下做到员工薪资的中位数最高?
	思路:我们可以去二分答案这个中位数,那么,如果说右区间小于这个中位数的,我们直接加他的左区间,同样的,当右区间大于这个中位数且左区间小于这个中位数(这里提到的中位数都指的是二分答案的答案)那么就直接判断,如果现在小的还不够,就直接用小的,如果小的够多了,就让他取中位数的钱,再最后就是,左区间也大于中位数的,那么直接使用左区间即可。