关于我C++引用传参时常量的值会改变的一个问题
  • 板块学术版
  • 楼主GameFreak
  • 当前回复2
  • 已保存回复2
  • 发布时间2023/1/2 19:11
  • 上次更新2023/10/24 05:47:19
查看原帖
关于我C++引用传参时常量的值会改变的一个问题
673643
GameFreak楼主2023/1/2 19:11

情况是这样的,事发时我个蒻在写 P3806(已 AC,不求调),这个点分治我第一次写 ,因此代码里面一堆问题

然后我开始调试,结果发现我的 dfs 函数传入的 fa 的值改变了。

排查后发现是 find 函数的影响,于是我将所有传参修改,从 const int& 改回了 int,这个问题消失了。

但是,我经常卡这个引用传参的常数,并且 bdfs 过,在前面添加 const 是能保证值不改变的。

所以我想问问,这个到底是怎么一回事呢?

调试的语句在 dfs 函数中,被注释了。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
static char buf[1000000],*p1=buf,*p2=buf,obuf[1000000],*p3=obuf;
#define flush() fwrite(obuf,p3-obuf,1,stdout)
#define getchar() p1==p2&&(p2=(p1=buf)+fread(buf,1,1000000,stdin),p1==p2)?EOF:*p1++
#define putchar(x) (p3-obuf<1000000)?(*p3++=x):(flush(),p3=obuf,*p3++=x)
template<typename T> inline void read(T&);
template<typename T> inline void write(T);
template<typename... Args> inline void read(Args& ...);
template<typename... Args> inline void write(Args ...);
const int N=20005;
int n,m;
int que[N];
bool ans[N];
struct edge{
	int to,val;
	edge():to(0),val(0){}
	edge(int To,int Val):to(To),val(Val){}
};
vector<edge> G[N];
int root,max_part,all;
int dis[N],belong[N],siz[N];
int cnt[N],a[N];
void find(int u,int fa){
	int now=0;
	siz[u]=1;
	for(edge e:G[u])
		if(e.to!=fa)
			find(e.to,u),siz[u]+=siz[e.to],now=max(now,siz[e.to]);
	now=max(now,all-siz[u]);
	if(now<=max_part) root=u,max_part=now;
}
void calc(int u,int fa,int rt){
	++cnt[belong[a[++a[0]]=u]];
	for(edge e:G[u])
		if(e.to!=fa) dis[e.to]=dis[u]+e.val,belong[e.to]=rt,calc(e.to,u,rt);
}
int pos[N];
inline bool cmp(int u,int v){return dis[u]<dis[v];}
void dfs(int u,int fa){
	memset(dis,0,sizeof dis),memset(belong,0,sizeof belong),memset(siz,0,sizeof siz);
//	cout<<u<<" "<<fa<<endl;
	max_part=114514,find(u,fa);
	++cnt[a[a[0]=1]=belong[root]=root];
	for(edge e:G[root])
		if(e.to!=fa)
			dis[e.to]=e.val,belong[e.to]=e.to,calc(e.to,root,e.to);
	memcpy(pos,cnt,sizeof pos);
	sort(a+1,a+a[0]+1,cmp);
	for(int i=1;i<=m;i++){
		if(ans[i]) continue;
		--cnt[belong[a[1]]];
		for(int L=1,R=a[0];L<R&&!ans[i];){
			while(dis[a[L]]+dis[a[R]]>que[i]) --cnt[belong[a[R--]]];
			ans[i]=R-L-cnt[belong[a[L]]]?1:0;
			--cnt[belong[a[++L]]];
		}
		memcpy(cnt,pos,sizeof cnt);
	}
	for(edge e:G[root])
		if(e.to!=fa)
//			cout<<e.to<<" "<<root<<" "<<fa<<endl,system("pause"),
			all=siz[e.to],dfs(e.to,root);
}
signed main(){
	read(n,m);
	for(int i=1,u,v,w;i<n;i++) read(u,v,w),G[u].emplace_back(edge(v,w)),G[v].emplace_back(edge(u,w));
	for(int i=1;i<=m;i++) read(que[i]);
	all=n,dfs(1,-1);
	for(int i=1;i<=m;i++) write(ans[i]?"AYE":"NAY",'\n');
	flush();
	return 0;
}

template<typename T> inline void read(T& x){
	x=0;bool flag=0;char ch=getchar();
	for(;ch<'0'||ch>'9';ch=getchar()) if(ch=='-') flag=1;
	if(flag) for(;ch>='0'&&ch<='9';ch=getchar()) x=(x<<1)+(x<<3)-(ch&15);
	else for(;ch>='0'&&ch<='9';ch=getchar()) x=(x<<1)+(x<<3)+(ch&15);
}
template<typename T> inline void write(T x){
    static int sta[40];
    int top=0;
    if(x<0){
        putchar('-');
        do sta[top++]=(-x)%10,x/=10;
        while(x);
    }
    else{
        do sta[top++]=x%10,x/=10;
        while(x);
    }
    while(top) putchar(sta[--top]^48);
}
template<> inline void write(char x){putchar(x);}
template<> inline void write(const char* str){while(*str!='\0') putchar(*str++);}
template<typename... Args> inline void read(Args& ...args){int arg[]{(read(args),0)...};}
template<typename... Args> inline void write(Args ...args){int arg[]{(write(args),0)...};}

2023/1/2 19:11
加载中...