J. 大秦酒店欢迎您

题解

  • 我们考虑莫队

  • 首先我们预处理出处于位置\(x\)的颜色下一次出现的位置\(nxt[x]\)以及上一次出现的位置\(pre[x]\)

  • 莫队上维护一下信息:

\(Ans\):\([l,r]\)的所有子区间的颜色数之和

\(num\):\([l,r]\)的颜色数

\(Lans\):\([l,l],[l,l + 1],[l,l + 2]...[l,r]\)这些区间的颜色数之和

\(Rans\):\([r,r],[r - 1, r],[r - 2, r]...[l,r]\)这些区间的颜色数之和

\(cnt[x]\):颜色\(x\)的出现次数

  • 我们以左端点\(l\)向左扩张为例, 表示左端点向左扩张对维护的信息的影响

\(l:=l-1\)

\(cnt[col[l]]:=cnt[col[l]] + 1\),颜色出现次数更新的同时更新\(num\)

\(Rans:=Rans + num\)

\(Lans := Lans + min(r, nxt[l]-1) - l + 1\)

\(Ans := Ans + Lans\)

  • 那么对于其他操作的影响也是类似的
const int mod = (1ll << 32);
const int N = 5e5 + 10, M = 4e5 + 10;
const int B = sqrt(N) + 1; int n, q, a[N];
int id[N], Ans, Lans, Rans, num, cnt[N], nxt[N], pre[N], ans[N], pos[N]; struct QUERY
{
int l, r, idx;
bool operator<(const QUERY &t) const
{
if (id[l] == id[t.l])
{
if (id[l] & 1)
return r < t.r;
else
return r > t.r;
}
else
return l < t.l;
}
} qry[N]; void del(int l, int r, int op)
{
if (op == 1) // Left
{
Ans -= Lans;
Lans -= min(r, nxt[l] - 1) - l + 1;
Rans -= num;
cnt[a[l]]--;
if (cnt[a[l]] == 0)
num--;
}
else // Right
{
Ans -= Rans;
Rans -= r - max(l, pre[r] + 1) + 1;
Lans -= num;
cnt[a[r]]--;
if (cnt[a[r]] == 0)
num--;
}
} void add(int l, int r, int op)
{
if (op == 1) // Left
{
cnt[a[l]]++;
if (cnt[a[l]] == 1)
num++;
Rans += num;
Lans += min(r, nxt[l] - 1) - l + 1;
Ans += Lans;
}
else // Right
{
cnt[a[r]]++;
if (cnt[a[r]] == 1)
num++;
Lans += num;
Rans += r - max(l, pre[r] + 1) + 1;
Ans += Rans;
}
} void solve()
{
cin >> n >> q;
for (int i = 1; i <= n; ++i)
{
cin >> a[i];
pre[i] = 0;
if (pos[a[i]])
{
pre[i] = pos[a[i]];
nxt[pos[a[i]]] = i;
}
pos[a[i]] = i;
nxt[i] = n + 1;
}
for (int i = 1; i <= q; ++i)
{
cin >> qry[i].l >> qry[i].r;
qry[i].idx = i;
}
for (int i = 1; i <= n; ++i) // 分块
id[i] = (i - 1) / B + 1;
sort(qry + 1, qry + q + 1); // 对查询进行排序
for (int i = 1, l = 1, r = 0; i <= q; ++i)
{
while (l > qry[i].l)
add(--l, r, 1);
while (r < qry[i].r)
add(l, ++r, 2);
while (l < qry[i].l)
del(l++, r, 1);
while (r > qry[i].r)
del(l, r--, 2);
ans[qry[i].idx] = Ans;
}
for (int i = 1; i <= q; ++i)
cout << ans[i] % mod << endl;
}

M. 斑马子树

\(1 \leq n \leq 10^5\)

题解

  • 我们考虑如果一颗子树是斑马子树,那么这颗子树能够产生贡献的时间区间段是多少
  • 我们考虑\(dp\)出子树\(u\)中最早变成斑马子树的时间戳\(l\),最晚变成非斑马子树的时间戳\(r\)
  • 那么\([l,r]\)的时间段上\(u\)的贡献一直为\(1\),我们考虑差分,最后前缀和统计答案即可
// M. 斑马子树
const int N = 2e5 + 10, M = 4e5 + 10; int n, t[N], mi[N], mx[N], ans[N];
vector<int> g[N]; void dfs(int u, int par)
{
mi[u] = mx[u] = t[u];
for (auto v : g[u])
{
if (v == par)
continue;
dfs(v, u);
mi[u] = min(mi[u], mi[v]);
mx[u] = max(mx[u], mx[v]);
}
ans[mi[u]]++;
ans[mx[u]]--;
} void solve()
{
cin >> n;
for (int i = 2; i <= n; ++i)
{
int u;
cin >> u;
g[u].push_back(i);
g[i].push_back(u);
}
for (int i = 1; i <= n; ++i)
{
int u;
cin >> u;
t[u] = i;
}
dfs(1, 0);
for (int i = 1; i <= n; ++i)
{
ans[i] = ans[i - 1] + ans[i];
cout << ans[i] << "\n "[i < n];
}
}

随机推荐

  1. DOM & BOM – 用 Canvas 修图

    前言 以前有写过一篇关于 canvas 处理图片的文章. 非常乱, 这篇做一个整理. 参考 Stack Overflow – HTML5 Canvas Rotate Image Stack Overf ...

  2. JavaScript – 类型转换

    介绍 JS 是弱类型语言, 在编程时, 有许多自动类型转换的技巧, 虽然大家都不太鼓励, 尤其是用了 TypeScript 之后, 但无可否认自动转换很方便, 看上去也很干净. 所以这篇还是要介绍一些 ...

  3. Windbg常用命令及分析套路

    自己也在使用windbg分析问题,但是属于刚入门所以转发下大神的总结:https://www.cnblogs.com/fj365/p/13295453.html 常用 !threadpool 查看线程 ...

  4. Vue3——SVG 图标配置

    1. SVG 图标配置 安装 SVG 依赖插件 vite-plugin-svg-icons npm i vite-plugin-svg-icons -D npm install fast-glob - ...

  5. 在Linux 中使用 pidstat 命令监控进程性能

    一.安装 pidstat 命令 检查系统是否已经安装了 pidstat 打开终端,输入以下命令检查是否已经安装了 pidstat: pidstat -V 如果显示版本信息,说明已经安装,可以跳过安装步 ...

  6. 小米13T Pro系统合集:性能与摄影的极致融合,值得你升级的系统ROM

    小米 13T Pro 是一款性能卓越.设计精美的旗舰机型,具备多项领先配置,且在与前一代产品及友商机型的对比中优势明显,值得深入探讨. 性能提升 小米 13T Pro 搭载了最新的 天玑 9200+ ...

  7. js有效括号匹配

    // 定义一个括号映射 const bracketMap = [ { left: '[', right: ']' }, { left: '<', right: '>' }, { left: ...

  8. python+ffmpeg视频转码转格式

    本文转发来自:https://blog.csdn.net/KH_FC/article/details/115771126 废话 python目前自己也是在学习当中,对python也不是特别精通,写视频 ...

  9. HEU KMS:一款超稳的MS Windows激活工具

    HEU KMS ACTIVATOR是一款功能齐全的免费Windows和Office系列激活工具. 打开程序,一步到位.直接点击开始就可以准备激活,Windows11/10乃至更早的版本都可以通用,顺带 ...

  10. Nuxt.js 应用中的 server:devHandler 事件钩子详解

    title: Nuxt.js 应用中的 server:devHandler 事件钩子详解 date: 2024/10/26 updated: 2024/10/26 author: cmdragon e ...