MnZn 求助
  • 板块学术版
  • 楼主wukaichen888
  • 当前回复3
  • 已保存回复3
  • 发布时间2022/12/24 13:29
  • 上次更新2023/10/24 06:46:58
查看原帖
MnZn 求助
723238
wukaichen888楼主2022/12/24 13:29

题目 | WA 0pts

救救孩子吧

#include<bits/stdc++.h>
//#include<type_traits>
//#include<debug/debug.h>
//#include<bits/stl_pair.h>
//#pragma GCC optimize(1)
//#pragma GCC optimize(2)
//#ifndef _STL_ALGOBASE_H
//#if __cplusplus > 201703L
//#define _STL_ALGOBASE_H 1
//#if __cplusplus >= 201103L
//#include<bits/c++config.h>
//#include<ext/type_traits.h>
//#include<bits/functexcept.h>
//#include<bits/stl_iterator.h>
//#include<ext/numeric_traits.h>
//#include<bits/concept_check.h>
//#include<bits/predefined_ops.h>
//#include<bits/cpp_type_traits.h>
//#include<bits/move.h> // For std::swap
//#include<bits/stl_iterator_base_types.h>
//#include<bits/stl_iterator_base_funcs.h>
using namespace std;
//#define int long long
//#define ll long long int
//#define db double
//#define ld long double
#define ull unsigned long long
typedef long long ll;
//#define I using
//#define AK namespace
//#define IOI std
//I AK IOI;


#define ls k<<1,l,mid
#define rs k<<1|1,mid+1,r
int n,root=1,to[100005],w[100005],a[100005],size1[100005],dep1[100005],f[100005],son1[100005],seg[100005],top[100005],rev[100005],tot1,fr[100005];
vector<int>v[100005];
struct point{
	int minn;
}tree[400005];
void pre(int k,int l,int r){
	if(l==r){
		tree[k].minn=a[rev[l]];
		return ;
	}
	int mid=(l+r)>>1;
	pre(ls);
	pre(rs);
	tree[k].minn=min(tree[k<<1].minn,tree[k<<1|1].minn);
	return ;
}
void change1(int k,int l,int r,int x,int d){
	if(l==r){
		tree[k].minn=d;
		return ;
	}            
	int mid=(l+r)>>1;
	if(x<=mid)
		change1(ls,x,d);
	else
		change1(rs,x,d);
	tree[k].minn=min(tree[k<<1].minn,tree[k<<1|1].minn);
	return ;
}
int query(int k,int l,int r,int x,int y){
	if(x<=l&&r<=y)
		return tree[k].minn;
	int mid=(l+r)>>1,res=0x3f3f3f3f;
	if(x<=mid)
		res=min(res,query(ls,x,y));
	if(mid<y)
		res=min(res,query(rs,x,y));
	return res;
}
void dfs1(int x,int fa){
	size1[x]=1;
	dep1[x]=dep1[fa]+1;
	for(int i=0;i<v[x].size();i++)
		if(v[x][i]^fa){
			f[v[x][i]]=x;
			dfs1(v[x][i],x);
			size1[x]+=size1[v[x][i]];
			if(size1[v[x][i]]>size1[son1[x]])
				son1[x]=v[x][i];
		}
	return ;
}
void dfs2(int x,int topf){
	seg[x]=++tot1;
	rev[tot1]=x;
	top[x]=topf;
	if(!son1[x])
		return ;
	dfs2(son1[x],topf);
	for(int i=0;i<v[x].size();i++)
		if(!top[v[x][i]]&&v[x][i]!=f[x])
			dfs2(v[x][i],v[x][i]);
	return ;
}
int ask1(int x,int y){
	int ans=0x3f3f3f3f;
	while(top[x]^top[y]){
		if(dep1[top[x]]<dep1[top[y]])
			swap(x,y);
		ans=min(ans,query(1,1,n,seg[top[x]],seg[x]));
		x=f[top[x]];
	}
	if(dep1[x]>dep1[y])
		swap(x,y);
	return min(ans,query(1,1,n,seg[x],seg[y]));
}
int main()
{
	scanf("%d",&n);
	for(int i=1,x,y;i<n;i++)
		scanf("%d%d%d",&fr[i],&to[i],&w[i]),v[fr[i]].push_back(to[i]),v[to[i]].push_back(fr[i]);
	dfs1(root,0);
	dfs2(root,root);
	a[root]=0x3f3f3f3f;
	for(int i=1;i<n;i++)
		if(dep1[fr[i]]>dep1[to[i]])
			a[fr[i]]=w[i];
		else
			if(dep1[fr[i]]<dep1[to[i]])
				a[to[i]]=w[i];
			else
				if(dep1[fr[i]]==dep1[to[i]])
					return puts("WTF!"),0;
	pre(1,1,tot1);
	int x,y,z;
	char op[10];
	while("QnQ"){
		scanf("%s",&op);
		if(op[0]=='Q'){
			scanf("%d%d",&x,&y);
			if(x^y)
				printf("%d\n",ask1(x,y));
			else
				puts("0");
		}
		else
			if(op[0]=='C'){
				scanf("%d%d",&x,&y);
				if(dep1[fr[x]]>dep1[to[x]])
					change1(1,1,n,seg[fr[x]],y);
				else
					if(dep1[fr[x]]<dep1[to[x]])
						change1(1,1,n,seg[to[x]],y);
					else
						if(dep1[fr[x]]==dep1[to[x]])
							return puts("WTF!"),0;
			}
			else
				if(op[0]=='D')
					break;
	}
	return 0;
}
2022/12/24 13:29
加载中...