大家好,我喜欢珂朵莉树,所以我用珂朵莉树 \(AC\) 了本题。


实际上,我们比较容易发现,这题实际上就是求 \([l,r]\) 中的所有点作为关键点时,虚树所压缩的所有点(实际上就是显现出来的点+在虚边上的点)。

那么我们容易发现,一个点 \(x\) 作为虚树所压缩的所有点的充要条件为:

  1. \(x\) 是至少一个虚树关键点的祖先。
  2. \(x\) 子树外至少有一个虚树关键点。

不易发现这里可以容斥。\((1+2)=(1all)-(1+!2)\)。


\((1+!2)\),即满足 \(1\),不满足 \(2\) 的情况。我们发现 \(lca(a_l,a_{l+1}...,a_r)\) 的所有祖先都满足这种情况,当然,也只有他们满足这种情况。

我们知道 \(lca(a_l,a_{l+1}...,a_r)=lca(a_x,a_y)\),其中 \(dfn_x=\max\limits_{i=l}^r dfn_i,dfn_y=\min\limits_{i=l}^r dfn_i\)。\(x,y\) 可以用 \(ST\) 表维护。

这一部分时间复杂度为 \(O(n\log n)\)。


\((1all)\),即满足 \(1\),不考虑 \(2\) 的情况。这里就比较难处理了。

我们设 \(col_{i,j}\) 表示当询问区间的 \(r\) 为 \(j\) 时,\(i\) 子树内所有虚树关键点中最大的下标。

当 \(r\) 右移至 \(r+1\) 时,路径 \((1,a_{r+1})\) 上所有点的答案都会变成 \(r+1\)。

相当于问题就变成:维护一个数据结构,可以实现树链染色。

树链数量越少越好,可以想到重链剖分,问题变为区间染色。

区间染色?区间推平?珂朵莉树!我们用树剖+珂朵莉树来进行区间染色。

考虑如何统计答案。

本人实测,不能遍历珂朵莉树中所有块来维护答案。考虑使用 \(BIT\) 维护颜色个数前缀和。

时间复杂度瓶颈在于树剖+珂朵莉树,时间复杂度 \(O(n\log^2 n)\)。


总结一下,时间复杂度为 \(O(n\log^2n)\)。

//中国珂学院 SNGXYZ 分院 OI 科第三办公室研究员 LYH
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=1e5+5;
int n,m,q,id,pos[N];
int a[N],ans[N];
vector<int>g[N];
int sz[N],tp[N];
int dfn[N],fa[N];
int sn[N],dep[N];
int sd[2][N][18];
void st_biao(){
for(int i=1;i<=m;i++)
sd[0][i][0]=sd[1][i][0]=dfn[a[i]];
for(int i=0;i<17;i++)
for(int j=1;j<=m-(1<<i);j++){
sd[0][j][i+1]=max(sd[0][j][i],sd[0][j+(1<<i)][i]);
sd[1][j][i+1]=min(sd[1][j][i],sd[1][j+(1<<i)][i]);
}
}int rmq(int l,int r,int opt){
int k=log2(r-l+1),x=r-(1<<k)+1;
if(opt) return min(sd[1][l][k],sd[1][x][k]);
return max(sd[0][l][k],sd[0][x][k]);
}struct que{
int l,r,id;
}qu[N];
int cmp(que x,que y){
return x.r<y.r;
}struct BIT{
int c[N];
void add(int x,int y){
for(;x<=m+1;x+=x&-x)
c[x]+=y;
}int sum(int x){
int re=0;
for(;x;x-=x&-x)
re+=c[x];
return re;
}
}bit;
struct odt{
int l,r;
mutable int v;
bool operator<(const odt &c)const{
return l<c.l;
}
};set<odt>st;
#define iter set<odt>::iterator
struct chtholly{
iter spilt(int x){
iter it=st.lower_bound({x,0,0});
if(it!=st.end()&&(*it).l==x) return it;
it--;if((*it).r<x) return st.end();
int l=(*it).l,r=(*it).r,v=(*it).v;
st.erase(it);
if(x!=l) st.insert({l,x-1,v});
return st.insert({x,r,v}).first;
}void assign(int l,int r,int v){
iter tr=spilt(r+1),tl=spilt(l);
for(iter it=tl;it!=tr;it++)
bit.add((*it).v+1,(*it).l-(*it).r-1);
bit.add(v+1,r-l+1);
st.erase(tl,tr);st.insert({l,r,v});
}
}seniorious;
void dfs1(int x,int f){
dep[x]=dep[f]+1;
for(auto y:g[x]){
if(y==f) continue;
dfs1(y,x);sz[x]+=sz[y];
if(sz[y]>sz[sn[x]]) sn[x]=y;
}fa[x]=f,sz[x]++;
}void dfs2(int x,int top){
dfn[x]=++id;
tp[x]=top;pos[id]=x;
if(!sn[x]) return;
dfs2(sn[x],top);
for(auto y:g[x])
if(y!=fa[x]&&y!=sn[x])
dfs2(y,y);
}int lca(int x,int y){
while(tp[x]!=tp[y]){
if(dep[tp[x]]<dep[tp[y]]) y=fa[tp[y]];
else x=fa[tp[x]];
}return dep[x]<dep[y]?x:y;
}void col(int x,int c){
while(x) seniorious.assign(dfn[tp[x]],dfn[x],c),x=fa[tp[x]];
}int main(){
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin>>n>>m>>q;
for(int i=1;i<n;i++){
int x,y;cin>>x>>y;
g[x].push_back(y);
g[y].push_back(x);
}dfs1(1,0);dfs2(1,1);
for(int i=1;i<=m;i++) cin>>a[i];
int now=1;st_biao();
for(int i=1;i<=q;i++)
cin>>qu[i].l>>qu[i].r,qu[i].id=i;
sort(qu+1,qu+q+1,cmp);
st.insert({1,n,0});
bit.add(1,n);
for(int i=1;i<=q;i++){
while(now<=qu[i].r) col(a[now],now),now++;
ans[qu[i].id]=bit.sum(qu[i].r+1)-bit.sum(qu[i].l);
int mn=pos[rmq(qu[i].l,qu[i].r,1)];
int mx=pos[rmq(qu[i].l,qu[i].r,0)];
ans[qu[i].id]-=dep[lca(mn,mx)]-1;
}for(int i=1;i<=q;i++)
cout<<ans[i]<<"\n";
return 0;
}/*Kaká
在太阳西斜的这个世界里,置身天上之森。
等这场战争结束之后,不归之人与望眼欲穿的众人。
人人本着正义之名,长存不灭的过去、逐渐消逝的未来。
我回来了,纵使日薄西山,即便看不到未来。
此时此刻的光辉,盼君勿忘。
————世界上最幸福的女孩
(珂朵莉树lyh专用标识)
*/

[JOISC 2023 Day3] Tourism 题解的更多相关文章

  1. 「JOISC 2019 Day3」穿越时空 Bitaro

    「JOISC 2019 Day3」穿越时空 Bitaro 题解: ​ 不会处理时间流逝,我去看了一眼题解的图,最重要的转换就是把(X,Y)改成(X,Y-X)这样就不会斜着走了. ​ 问题变成二维平面上 ...

  2. 【LOJ】#3036. 「JOISC 2019 Day3」指定城市

    LOJ#3036. 「JOISC 2019 Day3」指定城市 一个点的可以dp出来 两个点也可以dp出来 后面的就是在两个点的情况下选一条最长的链加进去,用线段树维护即可 #include < ...

  3. 简单数论 | Day3 部分题解

    A - The Euler function 来源:HDU 2824 计算[a,b]区间内的整数的欧拉函数值,需要掌握单个欧拉函数和函数表的使用. #include <iostream> ...

  4. [CCC​2019] Tourism题解

    我们先考虑一下拿部分分: subtask1 考虑因为 \(n < 2k\) ,那么我们的划分一定是从中间某个地方裁开,且满足 \(k\) 的条件的,我们发现当划分点在 \([n\ mod\ k, ...

  5. loj2880「JOISC 2014 Day3」稻草人

    题目链接:bzoj4237 ​ loj2880 考虑\(cdq\)分治,按\(x\)坐标排序,于是问题变成统计左下角在\([l,mid]\),右上角在\([mid+1,r]\)的矩形数量 我们先考虑固 ...

  6. CF round 623 Div.1D Tourism 题解

    题目链接:https://codeforces.com/contest/1314/problem/D 大意: \(n\) 个顶点的有向图,顶点编号为 \(1\) 到 \(n\),任意两个不同的顶点 \ ...

  7. [GDKOI2021] 普及组 Day3 总结 && 题解

    [ G D K O I 2021 ] 普 及 组 D a y 3 总 结 时间安排和昨天的GDKOI2021 Day2一样. 早上四个小时的快乐码题时间,然鹅我打了半小时的表 然后就是下午的题目讲解和 ...

  8. 夏令营提高班上午上机测试 Day 3 解题报告

    今天的题的确水.T3还是一道NOIP原题. 嘛,多刷点水题也不是什么坏事嘛. 说来也快,夏令营结束了整一星期了呢.大家也都回到了日常的暑假生活呢. 今天学业水平测试出成绩了...嗯结果还算满意呢,至少 ...

  9. petrozavodsk summer 2018 游记&&总结

    day0: 出发前训了一场比较水bapc2017保持手感(恢复信心),成功AK了,不过罚时略高.然后三人打车从紫金港到杭州东站,坐高铁到上海虹桥,再坐机场快线到浦东机场(傻乎乎的jsb帮爸爸付了钱,然 ...

  10. HDU 2023题解分析

    我想说这道题我还没弄明白我错哪了,交了20多遍一直都是Runtime Error,改了N次还是不对,后来搜了一下,说是数组开小了,又把数组开大,还不对,又改发现一个平均值求错,再改,还不对,洗洗睡吧. ...

随机推荐

  1. 使用TOPIAM 轻松搞定「Wiki.js」单点登录

    本文将介绍 TOPIAM 与 Wiki 集成步骤详细指南. 应用简介 Wiki.js 是一款高度可定制且现代化的开源 Wiki 系统,专为团队知识管理和文档协作设计,具有强大的扩展性和跨平台支持能力. ...

  2. ECShop开源商城与COS互通:降低本地存储负载、提升访问体验

    ECShop简介 ECShop是一款开源电子商务平台,具有简单易用.安全稳定.模块化设计等特点.它提供了完整的电子商务解决方案,包括商品管理.订单管理.支付管理.配送管理.会员管理.促销管理.数据统计 ...

  3. 04. PART 2 IdentityServer4 ASP.NET Core Identity .NET Core 3.1

    04. PART 2 IdentityServer4 ASP.NET Core Identity .NET Core 3.1 如果您已经来到这里,那么祝贺你的坚持,最难的部分已经完成了.我们仅仅需要的 ...

  4. 2024年1月Java项目开发指南12:前后端分离项目跨域问题解决

    创建config文件夹,创建WebConfig文件 代码如下(可以直接抄) package cc.xrilang.serversystem.config; import org.springframe ...

  5. IntelliJ IDEA生成jar包运行报Error:A JNI error has occurred,please check your installation and try again

    首先介绍一下IntelliJ IDEA生成jar包的方式: 1.打开项目,打开FIile->Project Structure...菜单.如下图: 选中Artifacts,点+号,选择JAR,再 ...

  6. Qt音视频开发11-通用监控布局控件(开源)

    一.前言 自从做监控系统以来,就一直有打算将这个功能独立出来一个类,这样的话很多系统用到此类布局切换,通用这个类就行,而且后期此布局会增加其他异形布局,甚至按照16:9之类的比例生成布局,之前此功能直 ...

  7. [转]基于 Node.js 实现前后端分离

    为了解决传统Web开发模式带来的各种问题,我们进行了许多尝试,但由于前/后端的物理鸿沟,尝试的方案都大同小异.痛定思痛,今天我们重新思考了"前后端"的定义,引入前端同学都熟悉的No ...

  8. [转]基于GMap.Net的地图解决方案

    一 地图的加载与显示 关于GMap的介绍与使用可以看我以前的文章: GMap.Net开发之在WinForm和WPF中使用GMap.Net地图插件 GMap.Net是.Net下一个地图控件,可以基于Ht ...

  9. 视频分析框架VideoPipe完整介绍

    (2024年4月编写) github地址 https://github.com/sherlockchou86/video_pipe_c 作者微信 zhzhi78(备注 videopipe),拉群交流( ...

  10. Python绘制土地利用和土地覆盖类型图详解

    土地利用和土地覆盖是环境科学和城市规划中的重要概念,它们能够帮助本文理解人与自然的关系,促进可持续发展.随着城市化进程的加快,科学地监测和管理土地资源显得尤为重要.Python作为一种强大的编程语言, ...