首页 > 其他分享 >CF1899G Unusual Entertainment 题解

CF1899G Unusual Entertainment 题解

时间:2024-03-07 13:16:14浏览次数:26  
标签:Unusual sub int 题解 CF1899G st re now id

分析

一眼树上启发式合并。

定义 \(x_i\) 为节点 \(i\) 在序列 \(p\) 中的下标。则问题转化为:对于每组 \(l,r,k\),询问以 \(k\) 为根的子树中是否有一个以上的节点,满足 \(l \le x_j \le r\)。

使用 set 存以 \(i\) 为根的子树中 \(x_j\) 的有序排列。则对于每个 \(k=i\) 的询问,去合并之后的 set 中二分查找即可。树上启发式合并的话套版子就行了,只是多加了一个更新询问答案的过程而已。

注:模板题可以参照这道。但该模板题难度评级显然有问题。

代码

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define re register
#define il inline
#define PII pair<int,pair<int,int>>
#define x first
#define y second

const int N=1e5+10;
int n,q;
int ne[N<<1],e[N<<1],h[N],idx;
struct node{
	set<int> st;
	vector<PII> Q;
	il int size(){return st.size();}
}sub[N];int x[N],id[N],cnt;
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){
	int mson=-1,msiz=0;
	id[now]=++cnt;
	for(re int i=h[now];i;i=ne[i]){
		int j=e[i];if(j==fa) continue;
		dfs(j,now);
		if(sub[id[j]].size()>msiz) msiz=sub[id[j]].size(),mson=j;
	}
	if(mson!=-1) id[now]=id[mson];
	for(re int i=h[now];i;i=ne[i]){
		int j=e[i];if(j==fa||j==mson) continue;
		for(auto s:sub[id[j]].st) sub[id[now]].st.insert(s);
		sub[id[j]].st.clear();
	}
	sub[id[now]].st.insert(x[now]);
	for(auto i:sub[now].Q){
		auto j=sub[id[now]].st.lower_bound(i.y.x);
		ans[i.x]=(j!=sub[id[now]].st.end()&&(*j)<=i.y.y);
	}
	return ;
}

il void solve(){
	cin>>n>>q;
	for(re int i=1;i<=n;++i) h[i]=ans[i]=x[i]=id[i]=0,sub[i].Q.clear(),sub[i].st.clear();
	idx=cnt=0;
	for(re int i=1,a,b;i<n;++i) cin>>a>>b,add(a,b),add(b,a);
	for(re int i=1,s;i<=n;++i) cin>>s,x[s]=i;
	for(re int i=1,l,r,x;i<=q;++i) cin>>l>>r>>x,sub[x].Q.push_back({i,{l,r}});
	dfs(1,0);
	for(re int i=1;i<=q;++i)
		if(ans[i]) cout<<"YES\n";
		else cout<<"NO\n";
	return ;
}

signed main(){
	int t;cin>>t;while(t--)
	solve();
	return 0;
}

标签:Unusual,sub,int,题解,CF1899G,st,re,now,id
From: https://www.cnblogs.com/harmisyz/p/18058639

相关文章

  • AT_abc328_f [ABC328F] Good Set Query 题解
    分析考虑并查集。对于\(a_i,b_i,d_i\),若\(a_i,b_i\)在之前的满足要求的操作中,\(a_i,b_i\)不在同一个集合里,则在之前\(X_{a_i},X_{b_i}\)的相对差值是可以任意改变的。令\(k=X_{a_i}-X_{b_i}\),则我们需要将\(a_i\)所在集合中所有元素的值增加\(d_i-k\)。然后将\(a_i,b......
  • CF1895D XOR Construction 题解
    分析对于异或,有性质\(a\oplusb=c,a\oplusc=b,a\oplusa=0\)。则对于\(a_i\oplusa_{i+1}\),其表示的结果就是\(b_{i}\oplusb_{i+2}\)。做一个前缀异或和,就能够得到\(b_1\)与\(b_2,b_3,\dots,b_n\)的异或结果。考虑枚举\(b_1\),因为在有解的情况下\(b_1\op......
  • CF1896D 题解
    Solution令\(l,r\)能使\(\sum\limits_{i=l}^{r}a_i=S\)。考虑先令\(l=1\),那么如果存在\(\sum\limits_{i=1}^{r}=S\),即输出YES。如果没有,则一定有\(\sum\limits_{i=1}^{r}=S-1\),且\(a_{r+1}=2\)。考虑对\(l,r\)进行调整:将\(l\)向左移,\(r\)向右移。可以发现当\(......
  • AT_abc222_f [ABC222F] Expensive Expense 题解
    分析没脑子的题目。一眼换根DP。定义\(\mathit{f}_{i}\)表示\(i\)到\(i\)为根子树中某一个节点的距离最大值;\(\mathit{g}_{i}\)表示\(i\)经过其父节点到某个节点的距离最大值。那答案就是\(\max(\mathit{f}_i,\mathit{g}_i)\)。考虑转移。\(\mathit{f}_i\)的转移很......
  • CF1223F Stack Exterminable Arrays 题解
    分析接着这个说。现在我们需要优化\(\mathit{nxt}_{i}\)。重新定义一下,\(\mathit{nxt}_{i,j}\)表示在后\(i\)个数中,\(j\)第一次出现的位置,且\([i+1,\mathit{nxt}_{i+1,a_i}-1]\)是一个合法串。这玩意很像一个DP,所以完全可以按照DP的转移思路转移:\(\mathit{nxt}_{i,j}=......
  • CF514D R2D2 and Droid Army 题解
    分析乱搞题。考虑将区间\([l,r]\)中所有人干掉的代价。设\(cnt_{i}=\max\limits_{j=l}^{r}a_{j,i}\),则代价为:\(\sum\limits_{i=1}^{m}cnt_i\)。很显然,只有在\(\sum\limits_{i=1}^{m}cnt_i\lek\)是,我们才能将这些人全部干掉。考虑枚举右端点\(r\),与每个\(r\)对应的最......
  • P4863 题解
    Solution为了方便,我们定义\(f_n=\sum_{i=1}^{n}\sum_{j=i}^{n}\lfloor\frac{i}{j}\rfloor\times(-1)^j\)。于是答案即为\(f_b-f_{a-1}\)。观察到如果我们直接计算这个式子而不做丝毫变形的话时间复杂度是\(O(n^2)\)的。考虑把先枚举\(j\),计算\(j\)的贡献。此时就有......
  • CF1066E Binary Numbers AND Sum 题解
    分析因为\(a\)是一直没有改变的,移动的只有\(b\),所以从\(a\)的每一位的贡献入手。对于\(a\)中的从低到高第\(i\)位,其对应的十进制值是\(a_{n-i+1}\times2^{i-1}\)。注意到\(b\)是每次右移一位的,所以在\(b\)中能与\(a_{n-i+1}\)匹配的都是在下标区间\([1,m-i+1]......
  • ABC263F 题解
    Solution考虑\(f_{i,j}\)表示第\(i\)个人赢下了第\(j\)场的最大价值,答案即为\(\max_{i=1}^{n}f_{i,m}\)。然后考虑状态转移,令\(l,r\)为第\(i\)个人在打第\(j\)场比赛时的区间,\(mid\)为区间中点,然后分为两种情况:第\(i\)个人在左半部分,转移即为\(f_{i,j}=f_{i......
  • P9757 [COCI2022-2023#3] Dirigent 题解
    分析对于一个从小到大(按编号排序)的长度为\(n\)的序列\(A\),有性质:相邻两个数之差的绝对值为\(1\)的数量为\(n-1\)。那么,对于这道题,能使环剪开一条边使其按编号排序,必有相邻两个\(i,j\),满足\((A_i-A_j=1)\)的数量为\(n-1\)。注意,因为这是个环,所以\(i,j\)大小关系不能......