大问题
  • 板块学术版
  • 楼主billtun
  • 当前回复2
  • 已保存回复2
  • 发布时间2024/7/23 20:57
  • 上次更新2024/7/23 22:06:40
查看原帖
大问题
546730
billtun楼主2024/7/23 20:57

为什么主流评测网站上用 c++14 -O2 交的代码中,正常的应该为 int main(),但是把 int 删去后也能得一样的分。

例: P3979 遥远的国度

正常:

#include<bits/stdc++.h>
#define ll long long
#define Maxn 100005

using namespace std;

ll read(){
	ll ret=0, sgn=0, ch=getchar();
	while(!isdigit(ch)){ sgn|=( ch=='-'), ch=getchar(); }
	while(isdigit(ch)){ ret=ret*10+ch-'0', ch=getchar(); }
	return !sgn ? ret : -ret;
}

ll n, m, a, b, val[Maxn], root=-1;
ll dfn[Maxn], dfncnt=0, rnk[Maxn];
ll son[Maxn], fa[Maxn][35], top[Maxn];
ll dep[Maxn], siz[Maxn];
vector<ll> v[Maxn];
ll opt, x, y, Value, id, num;

ll Min(ll a, ll b){
	return a>b ? b : a;
}

void dfs1(ll x){
	siz[x]=1, son[x]=-1;
	for(ll i=0;i<(ll)v[x].size();i++){
		ll tmp=v[x][i];
		if(!dep[tmp]){
			dep[tmp]=dep[x]+1, fa[tmp][0]=x;
			dfs1(tmp), siz[x]+=siz[tmp];
			son[x]=((!son[x] || siz[son[x]]<siz[tmp]) ? tmp : son[x]);
		}
	}
} // son, dep, fa, siz

void dfs2(ll x, ll Top){
	top[x]=Top;
	dfn[x]=++dfncnt, rnk[dfn[x]]=x;
	if(son[x]==-1){ return ; }
	dfs2(son[x], Top);
	for(ll i=0;i<(ll)v[x].size();i++){
		ll tmp=v[x][i];
		if(tmp!=fa[x][0] && tmp!=son[x]){
			dfs2(tmp, tmp);
		}
	}
} // dfn, rnk, top

struct Seg_tree{
#define lid (id<<1)
#define rid (id<<1|1)
	struct seg_tree{
		ll l, r, minl, lazy;
	} tr[Maxn<<2];
	
	void build(ll id, ll l, ll r){
		tr[id].l=l, tr[id].r=r;
		if(l==r){
			tr[id].lazy=0, tr[id].minl=val[rnk[l]];
			return ;
		}
		
		ll mid=(l+r)>>1;
		build(lid, l, mid), build(rid, mid+1, r);
		tr[id].lazy=0, tr[id].minl=Min(tr[lid].minl, tr[rid].minl);
	}
	
	void pushdown(ll id){
		if(tr[id].l!=tr[id].r && tr[id].lazy){
			tr[lid].lazy=tr[rid].lazy=tr[id].lazy;
			tr[lid].minl=tr[rid].minl=tr[id].lazy;
			tr[id].lazy=0;
		}
	}
	
	void change(ll id, ll l, ll r, ll tov){
		pushdown(id);
		if(tr[id].l==l && tr[id].r==r){
			tr[id].lazy=tr[id].minl=tov;
			return ;
		}
		
		ll mid=(tr[id].l+tr[id].r)>>1;
		if(r<=mid){ change(lid, l, r, tov); }
		else if(l>mid){ change(rid, l, r, tov); }
		else{ change(lid, l, mid, tov), change(rid, mid+1, r, tov); }
		tr[id].minl=Min(tr[lid].minl, tr[rid].minl);
	}
	
	ll query(ll id, ll l, ll r){
		if(l>r){ return 9223372036854775807; }
		pushdown(id);
		if(tr[id].l==l && tr[id].r==r){
			return tr[id].minl;
		}
		
		ll mid=(tr[id].l+tr[id].r)>>1;
		if(r<=mid){ return query(lid, l, r); }
		else if(l>mid){ return query(rid, l, r); }
		else{ return Min(query(lid, l, mid), query(rid, mid+1, r)); }
	}
} sg;

void Change(ll x, ll y, ll v){
	while(top[x]!=top[y]){
		if(dep[top[x]]>dep[top[y]]){ x^=y, y^=x, x^=y; }
		sg.change(1, dfn[top[y]], dfn[y], v);
		y=fa[top[y]][0];
	}
	
	if(dep[x]>dep[y]){ x^=y, y^=x, x^=y; }
	sg.change(1, dfn[x], dfn[y], v);
}

ll LCA(ll x, ll y){
	while(top[x]!=top[y]){
		if(dep[top[x]]>dep[top[y]]){
			x=fa[top[x]][0];
		} else{
			y=fa[top[y]][0];
		}
	}
	return (dep[x]>dep[y] ? y : x);
}

int main() // this this this this this this this this this this this this this this this this this this this
{
	n=read(), m=read();
	for(ll i=1;i<n;i++){
		a=read(), b=read();
		v[a].push_back(b);
		v[b].push_back(a);
	} for(ll i=1;i<=n;i++){
		cin>>val[i];
	} cin>>root;
	
	dep[1]=1, fa[1][0]=0;
	dfs1(1), dfs2(1, 1);
	sg.build(1, 1, n);
	
	for(ll i=1;i<=20;i++){
		for(ll j=1;j<=n;j++){
			fa[j][i]=fa[fa[j][i-1]][i-1];
		}
	}
	
	for(ll i=1;i<=m;i++){
		opt=read();
		if(opt==1){
			root=read();
		} else if(opt==2){
			x=read(), y=read(), Value=read();
			Change(x, y, Value);
		} else{
			id=read();
			if(root==id){
				printf("%lld\n", sg.query(1, 1, n));
			} else if(dep[LCA(id, root)]<dep[id]){
				printf("%lld\n", sg.query(1, dfn[id], dfn[id]+siz[id]-1));
			} else{
				num=root;
				for(ll i=20;i>=0;i--){
					if(dep[fa[num][i]]>dep[id]){
						num=fa[num][i];
					}
				}
//				ll a1=sg.query(1, 1, dfn[num]-1);
//				puts("hjghfads");
//				cout<<dfn[num]<<" "<<siz[num]<<" "<<n<<endl;
//				ll a2=sg.query(1, dfn[num]+siz[num], n);
//				puts("jgadfkjfgjhgfhfdsg");
				printf("%lld\n", Min(sg.query(1, 1, dfn[num]-1), sg.query(1, dfn[num]+siz[num], n)));
			}
		}
	}
	return 0;
}

删去:

#include<bits/stdc++.h>
#define ll long long
#define Maxn 100005

using namespace std;

ll read(){
	ll ret=0, sgn=0, ch=getchar();
	while(!isdigit(ch)){ sgn|=( ch=='-'), ch=getchar(); }
	while(isdigit(ch)){ ret=ret*10+ch-'0', ch=getchar(); }
	return !sgn ? ret : -ret;
}

ll n, m, a, b, val[Maxn], root=-1;
ll dfn[Maxn], dfncnt=0, rnk[Maxn];
ll son[Maxn], fa[Maxn][35], top[Maxn];
ll dep[Maxn], siz[Maxn];
vector<ll> v[Maxn];
ll opt, x, y, Value, id, num;

ll Min(ll a, ll b){
	return a>b ? b : a;
}

void dfs1(ll x){
	siz[x]=1, son[x]=-1;
	for(ll i=0;i<(ll)v[x].size();i++){
		ll tmp=v[x][i];
		if(!dep[tmp]){
			dep[tmp]=dep[x]+1, fa[tmp][0]=x;
			dfs1(tmp), siz[x]+=siz[tmp];
			son[x]=((!son[x] || siz[son[x]]<siz[tmp]) ? tmp : son[x]);
		}
	}
} // son, dep, fa, siz

void dfs2(ll x, ll Top){
	top[x]=Top;
	dfn[x]=++dfncnt, rnk[dfn[x]]=x;
	if(son[x]==-1){ return ; }
	dfs2(son[x], Top);
	for(ll i=0;i<(ll)v[x].size();i++){
		ll tmp=v[x][i];
		if(tmp!=fa[x][0] && tmp!=son[x]){
			dfs2(tmp, tmp);
		}
	}
} // dfn, rnk, top

struct Seg_tree{
#define lid (id<<1)
#define rid (id<<1|1)
	struct seg_tree{
		ll l, r, minl, lazy;
	} tr[Maxn<<2];
	
	void build(ll id, ll l, ll r){
		tr[id].l=l, tr[id].r=r;
		if(l==r){
			tr[id].lazy=0, tr[id].minl=val[rnk[l]];
			return ;
		}
		
		ll mid=(l+r)>>1;
		build(lid, l, mid), build(rid, mid+1, r);
		tr[id].lazy=0, tr[id].minl=Min(tr[lid].minl, tr[rid].minl);
	}
	
	void pushdown(ll id){
		if(tr[id].l!=tr[id].r && tr[id].lazy){
			tr[lid].lazy=tr[rid].lazy=tr[id].lazy;
			tr[lid].minl=tr[rid].minl=tr[id].lazy;
			tr[id].lazy=0;
		}
	}
	
	void change(ll id, ll l, ll r, ll tov){
		pushdown(id);
		if(tr[id].l==l && tr[id].r==r){
			tr[id].lazy=tr[id].minl=tov;
			return ;
		}
		
		ll mid=(tr[id].l+tr[id].r)>>1;
		if(r<=mid){ change(lid, l, r, tov); }
		else if(l>mid){ change(rid, l, r, tov); }
		else{ change(lid, l, mid, tov), change(rid, mid+1, r, tov); }
		tr[id].minl=Min(tr[lid].minl, tr[rid].minl);
	}
	
	ll query(ll id, ll l, ll r){
		if(l>r){ return 9223372036854775807; }
		pushdown(id);
		if(tr[id].l==l && tr[id].r==r){
			return tr[id].minl;
		}
		
		ll mid=(tr[id].l+tr[id].r)>>1;
		if(r<=mid){ return query(lid, l, r); }
		else if(l>mid){ return query(rid, l, r); }
		else{ return Min(query(lid, l, mid), query(rid, mid+1, r)); }
	}
} sg;

void Change(ll x, ll y, ll v){
	while(top[x]!=top[y]){
		if(dep[top[x]]>dep[top[y]]){ x^=y, y^=x, x^=y; }
		sg.change(1, dfn[top[y]], dfn[y], v);
		y=fa[top[y]][0];
	}
	
	if(dep[x]>dep[y]){ x^=y, y^=x, x^=y; }
	sg.change(1, dfn[x], dfn[y], v);
}

ll LCA(ll x, ll y){
	while(top[x]!=top[y]){
		if(dep[top[x]]>dep[top[y]]){
			x=fa[top[x]][0];
		} else{
			y=fa[top[y]][0];
		}
	}
	return (dep[x]>dep[y] ? y : x);
}

main() // this this this this this this this this this this this this this this this this this this this
{
	n=read(), m=read();
	for(ll i=1;i<n;i++){
		a=read(), b=read();
		v[a].push_back(b);
		v[b].push_back(a);
	} for(ll i=1;i<=n;i++){
		cin>>val[i];
	} cin>>root;
	
	dep[1]=1, fa[1][0]=0;
	dfs1(1), dfs2(1, 1);
	sg.build(1, 1, n);
	
	for(ll i=1;i<=20;i++){
		for(ll j=1;j<=n;j++){
			fa[j][i]=fa[fa[j][i-1]][i-1];
		}
	}
	
	for(ll i=1;i<=m;i++){
		opt=read();
		if(opt==1){
			root=read();
		} else if(opt==2){
			x=read(), y=read(), Value=read();
			Change(x, y, Value);
		} else{
			id=read();
			if(root==id){
				printf("%lld\n", sg.query(1, 1, n));
			} else if(dep[LCA(id, root)]<dep[id]){
				printf("%lld\n", sg.query(1, dfn[id], dfn[id]+siz[id]-1));
			} else{
				num=root;
				for(ll i=20;i>=0;i--){
					if(dep[fa[num][i]]>dep[id]){
						num=fa[num][i];
					}
				}
//				ll a1=sg.query(1, 1, dfn[num]-1);
//				puts("hjghfads");
//				cout<<dfn[num]<<" "<<siz[num]<<" "<<n<<endl;
//				ll a2=sg.query(1, dfn[num]+siz[num], n);
//				puts("jgadfkjfgjhgfhfdsg");
				printf("%lld\n", Min(sg.query(1, 1, dfn[num]-1), sg.query(1, dfn[num]+siz[num], n)));
			}
		}
	}
	return 0;
}

两者都是 100 pts 。

WHY???

2024/7/23 20:57
加载中...