传送门
思路
A
思路是这样的,考虑每个人都要被干掉,自己的战斗力先算上
然后对于每条边,边所连接的两人总有一个被先干掉,边必然会产生一个贡献
边的贡献取连接的两人中战斗力较小的就好了
我模拟了这个过程,写麻烦了,将就看233333
B
这题是算贡献的
假设S串不同,我们移动T串,易知T串的每个字符和S串的每个字符都对应了一次
然后S串每次循环时情况一样
所以我们开一个26的桶,统计一下T中每个字母的频数
遍历一边S串求出一次的贡献,总贡献就是一次贡献的n倍
然后该模多少模一下就好了
C
这题有个小坑,给的是站点,但票务计算要计算站区间233333
考虑到数据范围贼小,暴力模拟一下就好了
P.S. 大数据范围需要区间修改线段树了,在此不赘述
D
我都不知道我的做法对不对233333
时间复杂度是$O(nlog_2^2n)$
首先需要给所有的订单排序,结束时间早的放前面,结束时间相同要求时间短的放前面
然后我们考虑类似于$O(nlog_2n)$的$LIS$的做法来DP
假设$dp[i]$表示完成了i个任务最快需要多久
对于每一个任务,我们算出它的最晚进行时间,也就是令$T_e=T_2-T_1$
然后假设当前最多完成了$m$个任务,
如果$dp[m]<=T_e$,那么最多完成的任务数($m$)+1,同时记下这个任务
如果不行,我们需要知道完成几个任务之后可以完成当前任务
这里需要二分一下,然后我们与此同时还要记下前$i$个已完成的任务的$T_1$最大值,考虑可修改,于是树状数组
自此整道题需要重新思考
我们重新定义$dp[i]$为完成了前i个任务最快情况下第$i$个任务的所需时间
然后用树状数组统计前缀和,这样二分的时候复杂度是$O(log_2^2n)$
与此同时我们依然需要树状数组维护前$m$个任务的前缀最大值,这个维护也是$O(log^2_2n)$
继续刚才的思路,如果这个任务可以再已有的基础上继续完成,我们就继续完成就好了
否则的话二分出一个$k$,使得前k个任务的完成时间不大于$T_e$
同时前$k+1$个任务的完成时间大于$T_e$
然后我们用当前任务和前$k+1$个任务比较,如果当前任务的所需时间小于前$k+1$个任务的中最大的那个任务的所需时间,我们就用当前任务去更新
这样下去,最后统计得出的$m$为我们最多能送出多少份订单
输出$n-m$就是最少会收到多少份差评了
思路较复杂,运气好,用了两个树状数组硬莽过去了
E
注意到一个事实,我们对于一个$x$位数,决定它是不是回文数的只是后$\frac{x}{2}$位
因此我们发现最多从$n$向下枚举到$n-10^5$左右就能得到答案,暴力就好了呀
F
DFS直接暴力,剪剪枝就可以剪过去了
G
考虑自己的排名很小的情况,可以直接优先队列模拟
那么自己排名很大的时候,我们可以用二分去逼近
二分逼近到某一时刻正在安检和已经安检完毕的人刚好小于$x$
且下一时刻正在安检和已经安检完毕的人数不小于$x$
然后我们对每个门计算一下它目前安检的进度,拿优先队列跑若干轮就解决了
代码
A
1 | struct node |
B
1 | const LL mod=1e9+7; |
C
1 | int a[105]; |
D
1 | const int maxn=100005; |
E
1 | int a[15]; |
F
1 | struct node |
G
1 | LL a[1005]; |