首页 > 其他分享 >CF1899G题解

CF1899G题解

时间:2024-01-19 15:36:20浏览次数:28  
标签:ch int 题解 CF1899G memset le ans

Unusual Entertainment

题目传送门

题解

真的不要太典,,,

考虑点 \(u\) 是 \(v\) 的后代等价于 \(u\) 在子树 \(v\) 中,dfs 序直接走起,变成判断是否存在 \(i\) 使得:

\[in_x\le in_{p_i}\le out_x,l\le i\le r \]

二维数点,启动!

代码:

#include<bits/stdc++.h>
using namespace std;
#define int long long
inline int rd() {
	int s=0,m=0;char ch=getchar();
	while(!isdigit(ch)) {if(ch=='-')m=1;ch=getchar();}
	while( isdigit(ch)) s=(s<<3)+(s<<1)+(ch^48),ch=getchar();
	return m?-s:s;
}
int tt,n,q,p[100005],ans[100005];
int h[100005],cnt;
struct QWQ{int v,nxt;} e[100005*2];
void add(int u,int v) {e[++cnt]={v,h[u]},h[u]=cnt;}
int in[100005],out[100005],tot;
void dfs(int u,int p) {
	in[u]=++tot;
	for(int i=h[u];i;i=e[i].nxt) {
		int v=e[i].v;
		if(v==p) continue;
		dfs(v,u);
	}
	out[u]=tot;
}
struct Query{int l,x,id;} a[200005];
bool cmp(Query a1,Query a2) {return a1.l<a2.l;}
struct Binary_Indexed_Tree {
	int t[100005];
	int lb(int x) {return x&-x;}
	int sum(int x) {int s=0;for(int i=x;i;i-=lb(i)) s+=t[i];return s;}
	int query(int x,int y) {return sum(y)-sum(x-1);}
	void add(int x,int k) {for(int i=x;i<=n;i+=lb(i)) t[i]+=k;}
} t;
signed main() {
	cin>>tt;
	while(tt--) {
		n=rd(),q=rd();
		memset(h,0,sizeof(h));tot=cnt=0;
		memset(ans,0,sizeof(ans));
		memset(t.t,0,sizeof(t.t));
		for(int i=1;i<n;i++) {
			int u=rd(),v=rd();
			add(u,v),add(v,u);
		}
		dfs(1,0);
		for(int i=1;i<=n;i++) 
			p[i]=rd();
		for(int i=1;i<=q;i++) {
			int l=rd(),r=rd(),x=rd();
			a[i*2-1]={l-1,x,-i};
			a[i*2]={r,x,i};
		}
		sort(a+1,a+q*2+1,cmp);
		for(int i=0,j=1;i<=n;i++) {
			if(i) t.add(in[p[i]],1);
			for(;j<=q*2&&a[j].l==i;j++) 
				if(a[j].id>0) ans[a[j].id]+=t.query(in[a[j].x],out[a[j].x]);
				else ans[-a[j].id]-=t.query(in[a[j].x],out[a[j].x]);
		}
		for(int i=1;i<=q;i++)
			puts(ans[i]>0?"YES":"NO");
		puts("");
	}
	return 0;
}

标签:ch,int,题解,CF1899G,memset,le,ans
From: https://www.cnblogs.com/operator-/p/17974762

相关文章

  • CF1899F题解
    Alex'swhims题目传送门题解构造题,感觉比G更难?可能是我不擅长构造。考虑点的度数,发现一次操作\(u,v_1,v_2\)会使\(deg_{v_1}\)减\(1\),使\(deg_{v_2}\)加\(1\),即一次操作最多减少一个叶子,那如果存在一个时刻使我们的叶子数量大于\(3\)个,下一次若问\(n-1\)则直接......
  • P6550题解
    P6550[COCI2010-2011#2]LUNAPARK题目传送门题解论证简单,构造逆天(好吧其实就是烦了点)。每个格子是正整数,所以我们必然尝试多走格子。我们发现,只要\(r,c\)中有一个是奇数,我们就可以全部走到,构造很简单:我们找准奇数边,假设是\(r\),蛇形地走,显然在奇数行我们会结束在末尾,在偶数......
  • P5133题解
    P5133tb148的客人题目传送门题解唯一的一篇题解还是交错题的……很简单的一个二分加差分题。显然是二分答案,考虑检验。如果\(2mid+1\gen\),那么所有人可以自由去到任意位置,一定可行;否则,我们求出每个人可以去到的区间范围,并以此推出要满足这个人的限制,\(1\)号需要在哪个区......
  • P3867题解
    P3867[TJOI2009]排列计数题目传送门题解\(k\)很小,不是分讨就是突破口。如果我们用这种方式生成排列:将\(1\)到\(n\)按顺序插入当前状态,那么你会发现当前的数\(x\)的插入被很大程度的限制住了,我们只需记录当前\(x-k\)到\(x-1\)的位置即可枚举出所有可能的下一状态,因......
  • P7312题解
    P7312[COCI2018-2019#2]Sunčanje题目传送门题解分类讨论的思想有点像P4169?要你对于每一个矩形,求是否存在编号比它大,与它有交的矩形。直接做需要用一个比较神仙的线段树用法,所以我们可以容斥:我们求出编号比它大,与它无交的矩形数量,最后与所有可能覆盖它的矩形共\(n-i\)个......
  • P6554题解
    P6554PromisesICan'tKeep题目传送门题解看题解都有些做烦了,就来发一篇。换根dp。第一遍dfs处理出\(Lef_u\)表示\(u\)子树内的叶子个数(包含自己),然后求出以\(1\)为根时的答案\(\sumLef_u*val_u\),注意特判根为叶子的情况。第二遍dfs大力换根就好了,从根\(u\)......
  • P9744题解
    P9744「KDOI-06-S」消除序列题目传送门题解记错时间错过模拟赛的sb来也。题目中的最关键信息就是\(a_i,b_i,c_i\ge0\),这意味着多做无用的操作一定不优,所以有:结论\(1\):优先进行\(1\)操作。这是因为我们不管我们在\(1\)操作前做什么操作都会被其推平覆盖,是无用操......
  • P8047题解
    P8047[COCI2015-2016#4]GALAKSIJA题目传送门题解显然是要删边变加边的,然后联通性也是显然要用并查集维护的,就是路径异或和需要一个数据结构来维护。发现:加边删边不影响两个点的路径异或和。所以我们可以处理出每个点到\(1\)号节点的路径异或和\(d\),于是\(Path_{u,v}=d_u......
  • P8034题解
    P8034[COCI2015-2016#7]Ozljeda题目传送门题解评橙差不多了。手玩一下样例,很容易发现\(x\)的循环节为\(K+1\),每一段分别为\(a_1,a_2,a_3,\dots,a_K,\bigoplus_{i=1}^Ka_i\)这几项,然后恰好循环节的异或值为\(0\),所以就可以直接维护前缀异或值,然后取模求答案。代码:#i......
  • [AGC048D] Pocky Game 题解
    题目链接点击打开链接题目解法好难的题,想不出来一点!!!首先给出一个第一个结论:最优策略下,每个人每次只会取一个石子或者取完一堆石子题解区都没有严谨证明,\(at\)的\(editorial\)也没证,所以我只能感性理解:下面以先手为例。如果最左边的石子数\(>\)其余所有堆的石子数,那么先......