T1
题意
有一颗
n
n
n个点的树,每个点有一个权值
a
a
a,设其儿子个数为
s
s
s,要满足每个点的
a
+
s
≤
m
a+s \le m
a+s≤m,求最多能删多少个点(一个点删掉后,它的a加到父亲上,所有儿子连到父亲上)。
1
≤
n
≤
2000000
,
1
≤
m
≤
100000
,
0
≤
a
i
≤
1000
1 \le n \le 2000000, 1 \le m \le 100000, 0 \le a_i \le 1000
1≤n≤2000000,1≤m≤100000,0≤ai≤1000
题解
考场:
一开始想的是DP,发现要无论如何要多记一维状态,也难以优化,更不可能线性。
然后对于这种数据范围猜大概是贪心,很直接地想到从叶子节点往上,在满足限制下尽可能多地删节点,即按
u
u
u的儿子的
a
a
a从小到大删,直到
a
[
u
]
a[u]
a[u]>
m
m
m就不能再加。也很容易证明这样是最优的:若删得更少,则它的好处是使
a
[
u
]
a[u]
a[u]减小,而这样最多的贡献就是多一个
u
u
u可以被删,且还会使
u
u
u的父亲
a
a
a变大,那还不如直接尽肯能地删,显然在个数一定时不挑最小的删不会更优。
递归计算时注意全局变量的清空。
T2
题意
有一颗
n
n
n个点的树,每条边有长度,可以点燃其中一些叶子节点,点燃后的节点会以一个单位的速度向周围燃烧,到一条边的端点时点燃这个端点,这样会有一个最后所有边的烧完的时间,求不同的时间的个数。
由于答案可能很多,请你输出方案数对
998244353
998244353
998244353(
=
7
×
17
×
223
+
1
=7×17×223+1
=7×17×223+1,一个质数)取模的结果。并输出前
1000
1000
1000 小的可被统计的时间。
2
≤
n
≤
500
,
1
≤
w
≤
10000
2 \le n \le 500,1 \le w \le 10000
2≤n≤500,1≤w≤10000
题解
考场:
看错题了,没看到只能烧叶子,然后没有思路,连暴力都没调出来。
以后一定要仔细审题 (不知道多少次提醒自己了)
正解:
原题非常不良心地要求取模,实际上随便想想都发现在时间在总边权范围内,且精度最多
0.5
0.5
0.5,再仔细考虑一下,发现最后烧掉的那条边要么从这条边两侧的两个端点烧过来,要么直接从一个端点烧过来,所以这样时间最多只有
n
2
n^{2}
n2个。
又注意到数据范围,于是考虑枚举出发的两个点/一个点,判断最后会烧在哪条边(一个点就枚举最后烧在哪个点),这样就枚举出了所有可能,于是只需判断每种情况是否可能。
考虑一种情况要可能,就是其它叶子节点都在该时间内被烧到,且其它点燃的叶子节点都不会使这个时间变短。一开始的想法是先点燃枚举的点,对于每一个叶子节点直接判断是否能否在该时间内被点燃,不能的话这个点就要点燃,但这样点燃的点会互相影响。不如对于点燃后不会影响最大值(即不会使枚举的最后烧完的边烧完的时间变短)的叶子节点都先点燃,最后判断点燃后烧完的时间是否与原时间一样(如果更大即不合法)。对于已知一些点点燃,求烧完的时间,
d
f
s
dfs
dfs两边做个DP即可
O
(
n
)
O(n)
O(n)求出。
T3
题意
有一颗n个点的树,每条边有一个数
w
i
wi
wi,有
m
m
m个询问,每个询问给出
x
,
y
x,y
x,y,判断x到y的路径上的数字重新排列是否能组成回文序列。
N
≤
1
0
6
,
M
≤
1
0
7
,
w
i
≤
n
N \le 10^6,M \le 10^7,wi \le n
N≤106,M≤107,wi≤n
题解
考场:
显然对于路径长度为偶数要每种数字都出先偶数次,奇数就有且仅有一个出现奇数次,又注意到
x
,
y
x,y
x,y的
l
c
a
lca
lca到根的路径会被算两次,对于奇偶性无影响,于是只需判断
x
,
y
x,y
x,y到根的路径上每种数字出现的次数的奇偶性是否完全相同或者有且仅差一个,用hash判一下即可。当时也不知道怎么想的,可能t2还没打暴力比较虚(看错题的严重后果),就写了个map判两个hash值是否只差一位,然后就TLE到只剩50pts。
正解:
要去掉map这个很大的log,显然用hash表,像链表那样存即可,均摊是O(1)的(反正比map好得多)。
可能我比较菜还被卡常了,注意两个地方:
1.hash值用异或,不要用加减,可以少判一次反过来的(改完就过了)
2.哈希表取质数会比较快(推荐1e6+7)
测试总结
其实题目都不难,1、3都应该比较轻松AC,但T3以为map有80,然后很少写过哈希表,再加上T2还没动就把比较虚,于是就gg了。以后要注意到map是很慢的(m=1e5都能TLE,甚至unordered_map也救不了),然后哈希表其实几行就没了。T2其实也能想,只是比较复杂,代码略长,场切可能有难度,但至少应打出暴力。可能昨天没睡好状态不好吧,连1、3都花了不少时间,也体现了代码力还不太行,以及以后千万要认真审题!!!