全wa,求助qwq
  • 板块P4116 Qtree3
  • 楼主ass_wecan
  • 当前回复1
  • 已保存回复1
  • 发布时间2022/8/31 18:54
  • 上次更新2023/10/27 12:56:56
查看原帖
全wa,求助qwq
505805
ass_wecan楼主2022/8/31 18:54

树剖,每次从1到v跑一遍线段树上的最小值

初始设置为全INF,如果结果是INF就输出-1,否则这个最小值就是答案

修改就单点修改,在线段树上改一个点

我寻思着我思路和代码好像都没问题哇,到底哪错了qwq

#include<bits/stdc++.h>
#define printlf(x) print(x),putchar('\n')
#define printsp(x) print(x),putchar(' ')
using namespace std;
inline int read(){
    int x=0;
    bool w=0;
    char c=getchar();
    while(!isdigit(c))  w|=c=='-',c=getchar();
    while(isdigit(c))   x=(x<<1)+(x<<3)+(c^48),c=getchar();
    return w?-x:x;
}
inline void print(int x){
    if(x<0) x=-x,putchar('-');
    if(x>9) print(x/10);
    putchar('0'+x%10);
}
const int N=1e5+5,INF=1e8;
int tree[N*3];
int head[N],top[N],siz[N],fa[N],son[N],dep[N],id[N],tag[N];
int n,Q,num,tot;
struct node{
	int to,nxt;
}Edge[N<<1];
inline void add(int u,int v){
	Edge[++tot].nxt=head[u];
	Edge[tot].to=v;
	head[u]=tot;
}
inline void dfs1(int x,int f){
	dep[x]=dep[f]+1,fa[x]=f,siz[x]=1;
	for(register int i=head[x];i;i=Edge[i].nxt){
		int v=Edge[i].to;
		if(v==f)	continue;
		dfs1(v,x);
		siz[x]+=siz[v];
		if(siz[v]>siz[son[x]])	son[x]=v;
	}
}
inline void dfs2(int x,int topx){
	top[x]=topx,id[x]=++num;
	if(!son[x])	return ;
	dfs2(son[x],topx);
	for(register int i=head[x];i;i=Edge[i].nxt){
		int v=Edge[i].to;
		if(v==fa[x] || v==son[x])	continue;
		dfs2(v,v);
	}
}
#define ls(x) x<<1
#define rs(x) x<<1|1
#define push_up(p) tree[p]=min(tree[ls(p)],tree[rs(p)])
inline void update(int p,int l,int r,int pl,int pr,int k){
//	cout<<p<<' '<<l<<' '<<r<<' '<<pl<<' '<<pr<<endl;
	if(l>pr || r<pl)	return ;
	if(l>=pl && r<=pr){
		tree[p]=k;
		return ;
	}
	int mid=l+r>>1;
	if(pl<=mid)	update(ls(p),l,mid,pl,pr,k);
	if(pr>mid)	update(rs(p),mid+1,r,pl,pr,k);
	push_up(p);	
}
inline int query(int p,int l,int r,int pl,int pr){
	if(l>pr || r<pl)	return INF;
	if(l>=pl && r<=pr)	return tree[p];
	int mid=l+r>>1,res=INF;
	if(pl<=mid)	res=min(res,query(ls(p),l,mid,pl,pr));
	if(pr>mid)	res=min(res,query(rs(p),mid+1,r,pl,pr));
	return res;	
}
inline int Query(int x,int y){
	int res=INF;
	while(top[x]!=top[y]){
		if(dep[top[x]]<dep[top[y]])	swap(x,y);
		res=min(res,query(1,1,n,id[top[x]],id[x]));
		x=fa[top[x]];
	}
	if(dep[x]>dep[y])	swap(x,y);
	res=min(res,query(1,1,n,id[x],id[y]));
	if(res==INF)	return -1;
	return res;
}
signed main(){
	n=read(),Q=read();
	for(register int i=1;i<=n*3;++i)	tree[i]=INF;
	for(register int i=1;i<n;++i){
		int u=read(),v=read();
		add(u,v),add(v,u);
	}
	dfs1(1,1);
	dfs2(1,1);
//	for(register int i=1;i<=n;++i)
//		cout<<id[i]<<' ';cout<<endl;
	while(Q--){
		int op=read(),v=read();
		if(op==1)	printlf(Query(1,v));
		else{
			if(tag[v])	update(1,1,n,id[v],id[v],INF);
			else	update(1,1,n,id[v],id[v],v);
			tag[v]^=1;	
		}
	}
    return 0;
}
2022/8/31 18:54
加载中...