CF1899G Unusual Entertainment 题解2
分析
对于区间问题,考虑莫队。
和这个一样转化问题。
把树变成 DFS 序之后,在序列上询问区间就是普通莫队模板了。用 set
记录当前区间里存放的有序 \(x'\)。移动完指针之后的判断是否存在就直接在 set
里二分。复杂度虽然大了不止一点,但是 \(3\) 秒还是能过的。没有压力。
代码
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define re register
#define il inline
const int N=1e5+10;
int n,q,w[N];
int ne[N<<1],e[N<<1],h[N],idx;
int dfsx[N],in[N],out[N],cnt;
struct node{
int l,r,L,R,id;
}Q[N];int len;
set<int> st;
int ans[N];
il void add(int a,int b){ne[++idx]=h[a],e[idx]=b,h[a]=idx;}
il void dfs(int now,int fa){
dfsx[++cnt]=now,in[now]=cnt;
for(re int i=h[now];i;i=ne[i]){
int j=e[i];if(j==fa) continue;
dfs(j,now);
}
out[now]=cnt;return ;
}
il bool cmp(node a,node b){
if(a.l/len!=b.l/len) return a.l<b.l;
if((a.l/len)&1) return a.r<b.r;
return a.r>b.r;
}
il void add(int x){st.insert(w[x]);}
il void del(int x){st.erase(st.lower_bound(w[x]));}
il bool query(int l,int r){
auto it=st.lower_bound(l);
return (it!=st.end()&&(*it)<=r);
}
il void ini(int n){
st.clear();cnt=idx=len=0;
for(re int i=1;i<=n;++i) h[i]=0;
}
il void solve(){
cin>>n>>q;
ini(n),len=sqrt(n);
for(re int i=1,a,b;i<n;++i) cin>>a>>b,add(a,b),add(b,a);
dfs(1,0);
for(re int i=1,x;i<=n;++i) cin>>x,w[x]=i;
for(re int i=1,l,r,x;i<=q;++i) cin>>l>>r>>x,Q[i]={in[x],out[x],l,r,i};
sort(Q+1,Q+q+1,cmp);
int l=1,r=0;
for(re int i=1;i<=q;++i){
while(l>Q[i].l) add(dfsx[--l]);
while(r<Q[i].r) add(dfsx[++r]);
while(l<Q[i].l) del(dfsx[l++]);
while(r>Q[i].r) del(dfsx[r--]);
ans[Q[i].id]=query(Q[i].L,Q[i].R);
}
for(re int i=1;i<=q;++i) puts(ans[i]?"YES":"NO");
return ;
}
signed main(){
int t;cin>>t;while(t--)
solve();
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!