题解 ICPC 2019 SH 区域赛 F 树上简单问题

CF的Gym里没找着 牛客的题目链接

首先这个题多测非常SB, 每次都要清空, 需要特别注意.

树剖应该都会吧, Defad之后也会发博客讲解, 这里主要讲一下线段树维护区间加区间乘区间赋值区间立方和.

区间加

首先, 想一下我们要维护什么.

我们推一下式子, 看看式子中有哪些是要维护的, 哪些是要修改的.

Defad曰, "岂曰线段树题非好题乎, 岂曰推式子非神题乎, 岂曰多测出题人不满门抄斩乎".

\(
(v + k)^{3}
\newline
= (v + k)(v + k)^{2}
\newline
= (v + k)(v^{2} + k^{2} + 2vk)
\newline
= v^{3} + k^{3} + 3v^{2}k + 3vk^{2}
\)

Defad在VP时被二项式定理忘记了, 所以这里直接硬推的.

在这个式子中, 我们用到了区间立方和与区间平方和与区间和, 区间和就不用推了, 推一下区间平方和的修改.

\(
(v + k)^{2}
\newline
= v^{2} + k^{2} + 2vk
\)

我们推的是单点修改的式子, 区间修改只需在纯 \(k\) 的项上乘 \(r - l + 1\) 即可.

为什么只有纯 \(k\) 的项需要乘区间长度? 因为我们在维护 \(v\) 时已经有区间长度了, 所以只有纯 \(k\) 项需要.

区间乘

区间乘推式子其实比区间加好推, 分别乘上 \(k\) 即可.

\((vk)^{3} = v^{3}k^{3}\)

\((vk)^{2} = v^{2}k^{2}\)

\(vk = vk\)

区间赋值

区间赋值其实很好实现, 这个不需要推式子, 就是想一下, 区间乘 \(0\) 然后区间加 \(k\) 实际上就相当于区间赋值了, Defad觉得这个挺重要的建议记一下.

代码

树剖就先不给代码了, 给一下线段树的 update 和传递标记, 这里用的是动态开点线段树.

题目要求取模.

inline
void pushup(int x) {
t[x].val1 = (t[t[x].ls].val1 + t[t[x].rs].val1) % Mod;
t[x].val2 = (t[t[x].ls].val2 + t[t[x].rs].val2) % Mod;
t[x].val3 = (t[t[x].ls].val3 + t[t[x].rs].val3) % Mod;
}
inline // 这个函数是结点加 f 乘 g 同时做了
void addmul(int *x, int l, int r, ll f, ll g) {
if (*x == 0) *x = ++cntt; // x 没有被修改过就是空结点
if (g ^ 1LL) { // 先乘, 如果乘 1 就不用乘了
ll g2 = g * g % Mod, g3 = g2 * g % Mod;
// 修改立方和
t[*x].val3 = t[*x].val3 * g3 % Mod;
// 修改平方和
t[*x].val2 = t[*x].val2 * g2 % Mod;
// 修改和
t[*x].val1 = t[*x].val1 * g % Mod;
// 打加标记
t[*x].add = t[*x].add * g % Mod;
// 打乘标记
t[*x].mul = t[*x].mul * g % Mod;
}
if (f ^ 0LL) { // 后加, 如果加 0 也不用加
ll f2 = f * f % Mod, f3 = f2 * f % Mod;
// 修改立方和
t[*x].val3 = (t[*x].val3 + f3 * (r - l + 1) % Mod) % Mod;
t[*x].val3 = (t[*x].val3 + 3LL * f2 * t[*x].val1 % Mod) % Mod;
t[*x].val3 = (t[*x].val3 + 3LL * f * t[*x].val2 % Mod) % Mod;
// 修改平方和
t[*x].val2 = (t[*x].val2 + f2 * (r - l + 1) % Mod) % Mod;
t[*x].val2 = (t[*x].val2 + 2LL * f * t[*x].val1 % Mod) % Mod;
// 修改和
t[*x].val1 = (t[*x].val1 + f * (r - l + 1) % Mod) % Mod;
// 打加标记
t[*x].add = (t[*x].add + f) % Mod;
}
}
inline
void pushdown(int x, int l, int r, int m) {
// 标记下传左儿子
addmul(&t[x].ls, l, m, t[x].add, t[x].mul);
// 标记下传右儿子
addmul(&t[x].rs, m + 1, r, t[x].add, t[x].mul);
// 清空加标记
t[x].add = 0LL;
// 清空乘标记
t[x].mul = 1LL;
}
inline // 一个函数做完 + 和 *
void update(int *x, int l, int r, int L, int R, ll f, ll g) {
if (!*x) *x = ++cntt;
if (L <= l && r <= R) {
addmul(*x, l, r, f, g);
} else {
int m = l + r >> 1;
pushdown(*x, l, r, m);
if (L <= m)
update(&t[*x].ls, l, m, L, R, f, g);
if (m + 1 <= R)
update(&t[*x].rs, m + 1, r, L, R, f, g);
pushup(*x);
}
}
// 区间加
update(&rt, 1, N, L, R, k, 1LL);
// 区间乘
update(&rt, 1, N, L, R, 0LL, k);
// 区间赋值
update(&rt, 1, N, L, R, k, 0LL);

题解 ICPC 2019 SH 区域赛 F 树上简单问题的更多相关文章

  1. ICPC 2019 徐州网络赛

    ICPC 2019 徐州网络赛 比赛时间:2019.9.7 比赛链接:The Preliminary Contest for ICPC Asia Xuzhou 2019 赛后的经验总结 // 比赛完才 ...

  2. HDU-5532//2015ACM/ICPC亚洲区长春站-重现赛-F - Almost Sorted Array/,哈哈,水一把区域赛的题~~

    F - Almost Sorted Array Time Limit:2000MS     Memory Limit:262144KB     64bit IO Format:%I64d & ...

  3. ICPC 2018 焦作区域赛

    // 2019.10.7 练习赛 // 赛题来源:2018 ICPC 焦作区域赛 // CF链接:http://codeforces.com/gym/102028 A Xu Xiake in Hena ...

  4. ACM-ICPC 2019南昌网络赛F题 Megumi With String

    ACM-ICPC 南昌网络赛F题 Megumi With String 题目描述 给一个长度为\(l\)的字符串\(S\),和关于\(x\)的\(k\)次多项式\(G[x]\).当一个字符串\(str ...

  5. (最新)2019年ICPC东亚地区-区域赛赛站网络赛以及现场赛时间安排

  6. 2019icpc徐州区域赛F

    F. The Answer to the Ultimate Question of Life, The Universe, and Everything. 我的第一道真·打表题 这次是真的打表啊,不是 ...

  7. 2017 ICPC/ACM 沈阳区域赛HDU6223

    Infinite Fraction Path Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java ...

  8. Tournament ZOJ - 4063 (青岛区域赛 F 打表)

    打表题.. 规律是找出来了 奈何优化不了 .... #include <iostream> #include <cstdio> #include <sstream> ...

  9. HDU 4818 RP problem (高斯消元, 2013年长春区域赛F题)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4818 深深地补一个坑~~~ 现场赛坑在这题了,TAT.... 今天把代码改了下,过掉了,TAT 很明显 ...

  10. HDU 4786 最小生成树变形 kruscal(13成都区域赛F)

    Fibonacci Tree Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

随机推荐

  1. ASP.NET Core – Razor Pages 冷知识

    Multiple Form Binding 问题 在一个 page 里面有 2 张 form, 那么就会有 2 个 model binding. 当任何一个 submit 的时候. 由于 2 个 mo ...

  2. SQL Server – 冷知识 (新手)

    前言 没有系统化学一本语言或技术, 那便会被一些冷知识坑. 这里做些记入. 变量作用域 SQL 是远古语法, 声明变量在最顶部就是一条上古法则. 如果我看见有了用这个法则写 C# 或 JS 我就会杀了 ...

  3. Shiro-认证绕过漏洞(CVE-2020-1957)

    漏洞原理 核心点就是shiro和spring对uri进行配合匹配的时候有缺陷导致的,shiro中很轻易就能绕过,其次spring中对;分号好像情有独钟,被大牛们发现后也就一下子绕过了. 主流paylo ...

  4. Windows安装Powershell7.x

    事件起因: 由于需要运行一个脚本,但是该脚本是广大网友群众使用Powershell7写的,我自带的是Powershell5,运行过程中总是出现莫名其妙的问题,于是决定将Powershell升级到Pow ...

  5. 自我介绍&博客指南&博客更新日志

    自我介绍 目前高中在读生 专用网名:Alloverzyt,端木 傲 忍 入站必读: 我所爱之人,敬祝 本人博客及动态免责声明 学历简述:成都市棕北小学,成都市石室联合中学,成都市石室中学 博客指南 本 ...

  6. ajax发送 put和delete请求

    AJAX发送 PUT和DELETE请求(转载)    转自:https://blog.csdn.net/liuyuanjiang109/article/details/78972644 ajax使用r ...

  7. linux那些事之页迁移(page migratiom)

    Page migration 页迁移技术是内核中内存管理的一种比较重要的技术,最早该技术诞生于NUMA系统中(Page migration [LWN.net]),后续由于内存规整以及CMA和COW技术 ...

  8. 2021年6月国产数据库排行榜:OceanBase、PolarDB会师TiDB、openGauss,入局开源阵营,逐鹿生态建设

    "首夏犹清和,芳草亦未歇",时至六月,百花齐放.百家争鸣的国产数据库市场依旧延续着如骄阳般火热的态势.不过从最新一期的 国产数据库流行度排行榜 Top 10 中不难发现,一个词足以 ...

  9. 开发者故事:基于 KubeSphere LuBan 架构打造下一代云交付平台

    前言 在 KubeSphere Marketplace,个人开发者的创意和才能正在逐渐崭露头角.今日,我们荣幸地向大家介绍 Shipper 云交付平台的开发者--凌波,一位云原生领域的资深专家. 凌波 ...

  10. 云原生爱好者周刊:这款支持全平台的 Podman Desktop 值得一试

    开源项目推荐 Podman Desktop Companion Podman 桌面客户端,支持 macOS.Windows 和 Linux 平台,后端支持原生 Podman(仅支持 Linux).Po ...