update 2019.4.3
1294
因为需要保证是正整数且严格递增,于是想到将原数-位数得到一串新的数列。发现只要保留新数列最长上升非负子序列,将其他进行改变即位最忧情况。n是1e5 采用nlogn的求LIS即可
1419
容易想到若为奇数
n
∗
n
−
1
∗
n
−
2
n*n-1*n-2
n∗n−1∗n−2这3个数gcd为1,且lcm最大
若为偶数可知
1.
n
∗
n
−
1
n*n-1
n∗n−1 gcd肯定为1(最后一位暴力找)
**2.**偶数-1为奇数,之后就是按照奇数来做即可
1449
将m分解成w进制,可以发现每位如果是1、0、w-1都是可以凑出来的。(1、0相当于加法,w-1相当于减法)1、0部分直接continue w-1只要在后一位加1即可。然后从低到高枚举发现无这3个数则无法称重
1307
二分答案,之后就是树上统计son值与输入的进行比较即可
1243
二分答案,每次都尽量往左放船,枚举过程判断是否存在不可能放下的情况以及当前位置是否超出M
(忘记判-1WA了一发)
1686
二分答案,check函数来判断区间众数个数>=mi的个数是否>=k
实现这一过程只要枚举左端点,看右端点最近能放到哪(用一个num数组统计该数出现的位置,当出现一个num值等于mi时终止)而该左端点的答案数则是n-右端点位置
1158
(现在来看 发现二维前缀和就可以过)
当时我的做法是先记录每一层的前缀和。之后枚举每一段纵列区间,从最上层往下枚举,若该层该区间都为1,则答案加上区间宽,否则答案更新为0.每次更改,对最终的ans取max即可
1241
由于每个数都是不同的,因此我们只要记录每个数出现的位置,如果小的数出现在相邻大数的右边,那么这里必定会存在移至队头或队尾的操作,且一旦移动,之后的移动一定可以保证一段有序。
知道这个性质之后我们对于每个相邻位置不合法的情况进行计算。且每次我们都考虑将这一段往后移动那么答案就是之前段往前移的次数加上该位置往后移动的次数,用公式表达就是ans=pre+n-i
之后我们对pre进行更新,变为当前位置往前移动的次数即pre=i
。
最后我们只要对pre再与答案取min即可
1434
我们发现1-n内的lcm即为1-n质数最高次幂的乘积。因此这题就可以转换成1-n内质数的最高次幂的倍数,且大于n的最小值当中的最大的值就是答案
1405
cf不知道做过多少次的树上dp。大致思想就是son表示儿子数,res表示儿子到其的答案数,ans表示真正的答案。
1717
答案为n-sqrt(n)。去年校赛题
1420
可以发现越大的袋鼠去匹配尽量大的袋鼠是最好的,因此想到先对原序列sort之后发现为了满足最小 被匹配的袋鼠不是越大越好,而是越靠近中间越好,因此小袋鼠的枚举从 n / 2 n/2 n/2开始倒叙枚举即可
1605
由题意发现一个人只涂奇数个白点。且1为必胜点,于是可以递推出白点个数为奇数个时先手必胜。
1682
给定一串不重复的数,求每个数作为区间中位数的区间个数
n
<
=
8000
n<=8000
n<=8000
建立
n
n
n个前缀和,每个前缀和代表以
a
[
i
]
a[i]
a[i]为中位数的前缀(即大于
a
[
i
]
a[i]
a[i]记作
1
1
1、小于
a
[
i
]
a[i]
a[i]记作
−
1
-1
−1、等于记作
0
0
0)之后就变成统计区间值为
0
0
0的区间个数问题,这个只要在枚举前缀和时记录个数记录数组表示前缀答案为
x
x
x的出现过几次,遍历时,若当前前缀为
y
y
y,他对答案的贡献就是记录数组
−
y
-y
−y的个数
1412
统计
A
V
L
AVL
AVL树节点恰为n的个数
n
<
=
2000
n<=2000
n<=2000
定义
d
p
[
i
]
[
j
]
dp[i][j]
dp[i][j]代表节点个数为
i
i
i的层数为j的个数,这样可以很容易想到一个
n
∗
d
e
e
p
n*deep
n∗deep的转移方程,整体复杂度为
n
∗
n
∗
d
e
e
p
n*n*deep
n∗n∗deep,然后我们发现生成深度为
i
i
i的
A
V
L
AVL
AVL所需的最小节点数类似于一个费波纳数列,所以
n
n
n为
2000
2000
2000的深度其实是个
l
o
g
log
log级别的,所以整体复杂度就变成
n
∗
n
∗
l
o
g
(
n
)
n*n*log(n)
n∗n∗log(n)这题就能过了
1366
给定朋友关系图,规定朋友之间的存款差距要小于等于d 问最富和最穷的差距。
转换为差分约束系统之后建图跑spfa,若存在一点未被松弛则输出-1,否则输出与原点的最大差即可
1445
题意略
只要按找关系建图,把一个颜色能变的颜色按编号从小到大设定边权从
1
1
1开始累加,之后跑最短路求道
n
n
n点的最短路即可
2000
可以把其想成线段割角,每次加一个矩形,相当于多加了一个外角和一个内角,所以角数每次加 2 2 2,答案是每次加上 4 4 4乘之前的角数
1791
这题维护一个栈,对于碰到()匹配时计算答案贡献,贡献为同时该层时()匹配的个数,由于一旦层数下降,那么之前存的高层的值对后继答案时没有贡献的,所以动态的在统计贡献的时候对层数+1的前驱个数清空即可。
1435
先求出F(x)质因数分解,再去构造s,构造方案为
- 大数在前,小数在后
- 对于质因数从大到小确定,这样做确保每个质因数都用上
- 确定位值是只取质因数(一个4可以构建成一个2一个3,因此取4的话位数少)
1714
大表跑出sg[i]表示二进制数中有i个1的数的sg值,之后把这n个sg值异或即可。
1737
以边对答案的贡献来考虑,发现这个边为了贡献尽可能大则对答案的贡献就是两端节点数的最小值*边权
1140
update 8.28 0:05
1122
题目给定2*2矩阵每个矩阵中都有一个机器人可上下左右走,问走k步恰好占满矩阵的方案数。这题对每个机器人求从该点走k步到其他的点的方案数然后 4 4 4^4 44的暴力求答案即可。解决走k步从一点到另一点的方案数联想到矩阵快速幂。
1125
题目给定n个不同的数问数列排序的最小代价(代价为交换两数相加)这种位置适配问题可以将适配点和实际应该的点相连发现能练成很多个单环(离散化预处理保证),于是我们只要考虑环内有序最小值即可。考虑这个问题容易想到的是每次都用环内最小值去交换适配位,代价就是最小值*(个数-1)+剩余总和-最小值。当是其实还有一种情况可能最小即先将环内最小值与队列最小值交换然后再环内排完序后
1161
题目给出一个数列每次操作将第i位的数加上改变后i-1位的数,