【求助】线段树——当小威遇上经济危机
  • 板块学术版
  • 楼主RainDuckling
  • 当前回复2
  • 已保存回复2
  • 发布时间2023/6/28 21:33
  • 上次更新2023/11/3 12:12:24
查看原帖
【求助】线段树——当小威遇上经济危机
666400
RainDuckling楼主2023/6/28 21:33

地址:当小威遇上经济危机

有谁能帮忙看一下这道题,我用的是线段树的算法,但是中间的tmp值一直是都是0,每次都输出No,应该是query函数的问题,但是无奈本人太弱查不出来,各位大佬能否帮忙看一下

中间可能有些调试语句没删干净,请见谅

代码:

#include <bits/stdc++.h>
#define gcd(a,b) b?gcd(b,a%b):a
#define lcm(a,b) a/(gcd(a,b))*b
#define lowbit(x) x&(-x)
using namespace std;
using ll=long long;
using ull=unsigned long long;
using pi=pair<int,int>;
using pll=pair<ll,ll>;
const int MAXN=2e5+5;
const int INF=INT_MAX;
inline int read(){
	int x=0,f=1;char ch=getchar();
	while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
	while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
	return x*f;
}

int n,m,edge_cnt,node_cnt,ind,root;
int head[MAXN],p[MAXN],v[MAXN];
int inq[MAXN],ouq[MAXN];
int ls[MAXN<<2],rs[MAXN<<2],maxv[MAXN<<2];
struct edge{
	int next,to;
}e[MAXN];

void add_edge(int u,int v){
	edge_cnt++;
	e[edge_cnt].next=head[u];
	head[u]=edge_cnt;
	e[edge_cnt].to=v;
}

void refresh(int p){
	maxv[p]=max(maxv[ls[p]],maxv[rs[p]]);
}

void dfs(int p,int fa){
	inq[p]=++ind;
	for(int i=head[p];i;i=e[i].next){
		int v=e[i].to;
		if(v!=fa){
			dfs(v,p);
		}
	}
	ouq[p]=++ind;
}
void modify(int &k,int l,int r,int pos,int val){
	if(!k)k=++node_cnt;
	if(l==r){
		maxv[k]=val;
	}
	else{
		int mid=(l+r)/2;
		if(pos<=mid){
			modify(ls[k],l,mid,pos,val);
		}
		else{
			modify(rs[k],mid+1,r,pos,val);
		}
	}
	refresh(k); 
}

int query(int k,int cl,int cr,int l,int r){
//	cout<<k<<' '<<cl<<' '<<cr<<' '<<l<<' '<<r<<endl;
	if(!k)return -INF;
	if(cl==l&&cr==r){
		return maxv[k];
	}
	else{
		int mid=(cl+cr)/2,ret=0;
		if(r<=mid){
			ret=query(ls[k],cl,mid,l,r);
		}
		else if(l>mid){
			ret=query(rs[k],mid+1,cr,l,r);
		}
		else{
			ret=max(query(ls[k],cl,mid,l,mid),query(rs[k],mid+1,cr,mid+1,r));
		}
		return ret;
	}
}
signed main(){
	n=read();
//	maxv[0]=-INF;
	for(int i=1;i<=n;i++){
		p[i]=read(),v[i]=read();
		add_edge(p[i],i);
	}
	dfs(1,0);
//	dfs();
	for(int i=1;i<=n;i++){
		modify(root,1,ind,inq[i],v[i]);
	}
	m=read();
	for(int i=1;i<=m;i++){
		char op;
		cin>>op;
		int x=read();
		if(op=='Q'){
			int tmp=query(root,1,ind,inq[x],ouq[x]);
			cout<<tmp<<endl;
			if(tmp>v[x]){
				cout<<"Yes"<<endl;
			}
			else{
				cout<<"No"<<endl;
			}
		}
		else{
			v[x]=read();
			modify(root,1,ind,inq[x],v[x]); 
		}
	}
	return 0;
}

//ACplease!!!


2023/6/28 21:33
加载中...