|
|
先创建一个 $map$,使 $m[队列元素]=$队列编号,这样后面好查找元素的组别; 再创建一个队列 $q[301]$,$q[i]$ 表示队列编号为 $i$ 的排队情况。$q[0]$ 表示小组的排序; 队列输入不用多说,只需要注意一个新小组的人入队要给新小组排上队; 队列输出时查看 $q[0]$ 队头,看到小组编号后查该小组的队头,再输出,注意小组的人全部出队后要把空小组删掉。
题目717 [SDOI 2007] 小组队列
AAAAAAAAAA
3
评论
2025-10-29 12:55:32
|
|
|
Pro4184 轻重数字 题解【题解】算法一:思路:动态规划,$dp[i]$ 是前 $i$ 个元素的有效划分方案数,则 $f[0]=1$(空数组有 $1$ 种划分方式),$f[i]$ 为所有满足 $[j+1,i]$ 是好数组的 $f[j]$ 的和。 时间复杂度:$O(n^2)$,即 $5000*5000=2.5*10^7$,期望 $15$ 分。 瓶颈:不能快速判断数组是否是好数组,不能快速累加 $f[j]$; 算法二:思路:有几处优化; $1$.对每个元素 $a[i]$,计算 $pre[i]$(上一次出现位置)和 $nxt[i]$(下一次出现位置),所以可以由好数组的性质“对于子数组内的重元素 $a[i]$,其前后出现位置必须在子数组外(否则会影响交替性)”优化判断好数组的条件; $2$.若 $j$ 在 $[L..R]$ 内时 $[j+1..i]$ 是好数组,则 $f[i]$ 需要累加 $f[L]+f[L+1]+...+f[R]$,所以用双线段树。好数组有两种起始类型(轻元素开始或重元素开始),需分别维护。因此使用两个线段树 $seg[0]$ 和 $seg[1]$,分别对应两种起始类型,每个线段树节点存储“区间内最大有效长度”和“对应方案数总和”支持区间增减(通过延迟标记)和单点更新; $3$.预先生成“区间更新事件”:当遍历到位置 $i$ 时,哪些 $j$ 的范围会因 $a[i]$ 的加入而成为有效划分点,事件按生效位置排序,遍历数组时依次触发,动态更新线段树,确保查询到的 $f[j]$ 都是有效的。 同样方式计算 $f[i]$,最终需减去重复计算的 $f[i-1]$,对 $1000003$ 取余后输出。 时间复杂度:$O(n*logn)$,即 $5*10^5*log5*10^5≈10^7$,轻松过 $4$ 秒时限; 期望得分:$100$;
题目4184 轻重数字
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
4
评论
2025-10-29 12:53:24
|
|
|
![]()
题目4076 小b爱旅行
5
1 条 评论
2025-10-24 11:19:14
|
|
|
![]()
题目4077 小b爱取模
3
评论
2025-10-24 11:18:43
|
|
|
Pro3920 编辑题目 题解Subtask1: n,m≤100注意到我们可以枚举每一对 (E,S) 并判断 Bob 是否必胜,最后将必胜的方案数除以 nm 就是答案。 判断是否必胜我们直接将边 E 删去并从起点 S 开始搜索即可,时间复杂度 O(n2m)。期望得分 30pts。 Subtask2: w=1除非 S 是叶子且 E 恰好是 S 的唯一出边,Bob 都是必胜的。统计是简单的,不再赘述。 Subtask3: n,m≤5000考虑从边双连通分量入手,我们枚举 E。 若 E 不是割边,那么删除 E 不会影响 S 所能到达的点/边集。只要原图中还存在边权与 E 相等的边,那 Bob 就是必胜的,贡献为 n。 若 E 是割边,那么删除 E 会将边双树分为两个连通块,而 S 只能遍历其所处的连通块,所以 Bob 必胜等价于该连通块中有边权与 E 相等的边。直接遍历两个连通块来判断即可。 割边的数量可以达到与 n 同阶,故时间复杂度为 O(nm)。期望得分 60pts。 Subtask3: n,m≤106考虑优化 E 是割边时的判断过程。注意到一个连通块必定是边双树中的一颗子树或者全树扣掉一颗子树,而后者可以直接用全局减去该子树得到。于是问题等价于求一棵子树中边权与根的父边相等的边的数量。 这个问题的做法非常多,容易 O(n) 实现,期望得分 100pts。
题目3920 编辑题目
4
1 条 评论
2025-10-24 11:15:02
|
|
|
首先来看这个什么三元组。
定义一种特殊的三元组:(x,y,z),其中x,y,z都代表纸带上格子的编号,这里的三元组要求满足以下两个条件:
x,y,z 是整数,x<y<z,y−x=z−y;x,z 颜色相同。
满足上述条件的三元组的分数规定为 (x+z)×(number_x+number_z)。
诶,我们发现,这个「分数」跟 y 之间,半个咕值的关系都没有啊 QAQ? 于是,秒懂: ∵y−x=z−y ∴x+z=2y 又,2y 是偶数,所以 x,z 同奇偶。 这就是 y 的用处啦QAQ。
由于不同颜色的 x,z 肯定不会产生分数,所以我们可以先把这个「狭长的纸带」按照颜色分类,最后把每种颜色产生的分数加起来即可。 然后不同奇偶性的 x,z 也不会产生分数,所以把每个颜色种类按照奇偶性再分个类,最后把奇数产生的分数和偶数产生的分数加起来即可。 举个例子: 格子编号 1 2 3 4 5 6 7 8 9 10 格子上的数字 5 5 3 2 2 2 7 8 2 5 格子颜色 2 2 1 1 2 1 2 2 2 1 那么先按照颜色分类: 颜色为 1 的: 格子编号 3 4 6 10 格子上的数字 3 2 2 5 格子颜色 1 1 1 1 颜色为 2 的: 格子编号 1 2 5 7 8 9 格子上的数字 5 5 2 7 8 2 格子颜色 2 2 2 2 2 2 再按照编号分类: 颜色为 1 ,编号为奇数的: 格子编号 3 格子上的数字 3 格子颜色 1 颜色为 1 ,编号为偶数的: 格子编号 4 6 10 格子上的数字 2 2 5 格子颜色 1 1 1 颜色为 2 ,编号为奇数的: 格子编号 1 5 7 9 格子上的数字 5 2 7 2 格子颜色 2 2 2 2 颜色为 2 ,编号为偶数的: 格子编号 2 8 格子上的数字 5 8 格子颜色 2 2 好的,分类完毕! 那么,怎么计算分数呢?
当然可以 O(n2) 暴力算一通。做法显然,这里不多说了。 不过,复杂度铁定爆炸。 考虑更优的做法。 拿上面那个例子中,颜色为 2 ,编号为奇数的 4 个格子来举个例子: 由于颜色显然是一样的,而且计算分数也和颜色无关,所以就不用再管颜色了。 然后设 f[i] 为这一组中第 i 个数的编号,n[i] 为这一组中第 i 的数的颜色。 i 1 2 3 4 f[i]1 5 7 9 n[i]5 2 7 2 先看前两个数,他们产生的分数为: (f[1]+f[2])×(n[1]+n[2]) 然后考虑当第三个数加入时,多出来的分数。 第三个数和第一个数会产生一些分数: (f[1]+f[3])×(n[1]+n[3]) 第三个数和第二个数也会产生一些分数: (f[2]+f[3])×(n[2]+n[3]) 所以多出来的分数为: (f[1]+f[3])×(n[1]+n[3])+(f[2]+f[3])×(n[2]+n[3]) 展开后,得到: f[1]⋅n[1]+f[1]⋅n[3]+f[3]⋅n[1]+f[3]⋅n[3]+f[2]⋅n[2]+f[2]⋅n[3]+f[3]⋅n[2]+f[3]⋅n[3] 把 n[3] 和 f[3] 提取出来: f[1]⋅n[1]+f[1]⋅n[3]+f[3]⋅n[1]+f[3]⋅n[3]+f[2]⋅n[2]+f[2]⋅n[3]+f[3]⋅n[2]+f[3]⋅n[3] (标红的是提取出来的 n[3],标蓝的是提取出来的 f[3]) n[3]⋅(f[1]+f[2]+f[3])+f[3]⋅(n[1]+n[2]+n[3])+n[1]⋅f[1]+n[2]⋅f[2] 从这个式子中,我们看出,只需要处理 f 数组,n 数组,还有 f[i]⋅n[i] 的前缀和即可。 后面也是一个一个添加进来,一样的。
题目2112 [NOIP 2015PJ]求和
1
评论
2025-10-23 20:30:02
|