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;
}

posted @   harmis_yz  阅读(2)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
点击右上角即可分享
微信分享提示