社区讨论

震惊,某萌新刚学oi竟然。。。。

P1505[国家集训队] 旅游参与者 11已保存回复 17

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
17 条
当前快照
1 份
快照标识符
@mi7y4gq3
此快照首次捕获于
2025/11/21 05:31
4 个月前
此快照最后确认于
2025/11/21 06:41
4 个月前
查看原帖
两百行的程序,还是希望有神仙帮我一下叭
CPP
  //  2019/5/11  //
 //   Melantha  //
 
#include <bits/stdc++.h>
#define lol long long
#define dob double
#define ull unsigned long long 
#define INF 214748364
#define ls p<<1
#define rs p<<1|1
#define N 100017
using namespace std;
const double eps = 1e-6;
inline lol read(){
    lol res=0,kkk=1; char ch=' ';
    while(!isdigit(ch)){ch=getchar();if(ch=='-')kkk=-1;}
    while(isdigit(ch)){res=res*10+ch-'0';ch=getchar();}
    return res*kkk;
}
int n,m;
int root;
int _size[N],deep[N],fa[N],son[N],a[N];
int mi[N<<2],mx[N<<2],sum[N<<2],tot,delta[N<<2];
int pos[N<<2],h[N<<2],belong[N<<2],id;
int cnt,head[N],nxt[N],to[N],w[N];
void qxx(int x,int y,int v)
{
	++cnt;
	nxt[cnt]=head[x];
	head[x]=cnt;
	to[cnt]=y;
	w[cnt]=v;
}
void add(int x,int y,int v)
{
	qxx(x,y,v);
	qxx(y,x,v);
}
void dfs1(int x)
{
	_size[x]=1;
	for(register int i=head[x];i;i=nxt[i])
	{
		int k=to[i];
		if(k!=fa[x]){
			fa[k]=x;
			a[k]=w[i];
			deep[k]=deep[x]+1;
			dfs1(k);
			_size[x]+=_size[k];
			if(_size[son[x]]<_size[k])son[x]=k;
		}
	}
}
void dfs2(int x,int chain)
{
	++id;
	pos[x]=id;
	h[id]=x;
	belong[x]=chain;
	if(son[x]){
		dfs2(son[x],chain);
	}
	for(register int i=head[x];i;i=nxt[i])
	{
		int k=to[i];
		if(k!=fa[x]&&k!=son[x]){
			dfs2(k,k);
		}
	}
}
void pushdown(int p){
	if(delta[p]){
		sum[ls]=-sum[ls];
		sum[rs]=-sum[rs];
		delta[ls]^=1;
		delta[rs]^=1;
		swap(mx[ls],mi[ls]);
		swap(mx[rs],mi[rs]);
    	mx[ls]*=-1;
		mx[rs]*=-1;
		mi[ls]*=-1;
		mi[rs]*=-1;
    	delta[p]=0;
    }
}
void pushup(int p)
{
	sum[p]=sum[ls]+sum[rs];
  	mx[p]=max(mx[ls],mx[rs]);
 	mi[p]=min(mi[ls],mi[rs]);
}
void build(int p,int l,int r)
{
	if(l==r){
		mx[p]=mi[p]=sum[p]=a[h[l]];
		return ;
	}
	int mid=(l+r)>>1;
	build(ls,l,mid);
	build(rs,mid+1,r);
	pushup(p);
}
void change(int p,int L,int R,int l,int r)
{
	if(l==L&&r==R){
		sum[p]=-sum[p];
		swap(mi[p],mx[p]);
		mi[p]*=-1;
		mx[p]*=-1;
		delta[p]^=1;
		return ;
	}
	pushdown(p);
	int mid=(L+R)>>1;
	if(r<=mid)change(ls,L,mid,l,r);
	else if(l<mid)change(rs,mid+1,R,l,r);
	else {
		change(ls,L,mid,l,mid);
		change(rs,mid+1,R,mid+1,R);
	}
	pushup(p);
}
int ask_min(int p,int L,int R,int l,int r)
{
	if(l==L&&r==R){
		return mi[p];
	}
	pushdown(p);
	int mid=(L+R)>>1;
	if(r<=mid)return ask_min(ls,L,mid,l,r);
	else if(l>mid)return ask_min(rs,mid+1,R,l,r);
	else return min(ask_min(ls,L,mid,l,mid),ask_min(rs,mid+1,R,mid+1,r));
}
int ask_max(int p,int L,int R,int l,int r)
{
	if(l==L&&r==R){
		return mx[p];
	}
	pushdown(p);
	int mid=(L+R)>>1;
	if(r<=mid)return ask_max(ls,L,mid,l,r);
	else if(l>mid)return ask_max(rs,mid+1,R,l,r);
	else return max(ask_max(ls,L,mid,l,mid),ask_max(rs,mid+1,R,mid+1,r));
}
int ask_sum(int p,int L,int R,int l,int r)
{
    if(l==L&&r==R){
        return sum[p];
    }
	pushdown(p);
    int mid=(L+R)>>1;
    if(r<=mid)return ask_sum(ls,L,mid,l,r);
    else if(l>mid)return ask_sum(rs,mid+1,R,l,r);
    else return ask_sum(ls,L,mid,l,mid)+ask_sum(rs,mid+1,R,mid+1,r);
}
void C_pot(int p,int L,int R,int x,int k)
{
    if(L==R){
        mi[p]=sum[p]=mx[p]=k;
        return ;
    }
    pushdown(p);
    int mid=(L+R)>>1;
    if(x<=mid)C_pot(ls,L,mid,x,k);
    else C_pot(rs,mid+1,R,x,k);
    pushup(p);
}
void C_che(int x,int y)
{
	while(belong[x]!=belong[y]){
		if(deep[belong[x]]<deep[belong[y]])swap(x,y);
		change(root,1,n,pos[belong[x]],pos[x]);
		x=fa[belong[x]];
	}
	if(pos[x]>pos[y])swap(x,y);
	change(root,1,n,pos[x],pos[y]);
}
int Q_min(int x,int y)
{
	int ans=INF;
	while(belong[x]!=belong[y]){
		if(deep[belong[x]]<deep[belong[y]])swap(x,y);
		ans=min(ans,ask_min(root,1,n,pos[belong[x]],pos[x]));
		x=fa[belong[x]];
	}
	if(pos[x]>pos[y])swap(x,y);
	return min(ans,ask_min(root,1,n,pos[x],pos[y]));
}
int Q_max(int x,int y)
{
	int ans=-INF;
	while(belong[x]!=belong[y]){
		if(deep[belong[x]]<deep[belong[y]])swap(x,y);
		ans=max(ans,ask_max(root,1,n,pos[belong[x]],pos[x]));
		x=fa[belong[x]];
	}
	if(pos[x]>pos[y])swap(x,y);
	return max(ans,ask_max(root,1,n,pos[x],pos[y]));
}
int Q_sum(int x,int y)
{
    int ans=0;
    while(belong[x]!=belong[y]){
        if(deep[belong[x]]<deep[belong[y]])swap(x,y);
        ans+=ask_sum(root,1,n,pos[belong[x]],pos[x]);
        x=fa[belong[x]];
    }
    if(pos[x]>pos[y])swap(x,y);
    return ans+ask_sum(root,1,n,pos[x],pos[y]);
}
int main()
{
	n=read();
	memset(mx,-63,sizeof(mx));
	memset(mi,63,sizeof(mi));
	for(register int i=1;i<n;i++)
	{
		int x=read()+1,y=read()+1,v=read();
		add(x,y,v);
	}
	dfs1(1);dfs2(1,1);
	build(root,1,n);
	m=read();
	string s;
	for(register int i=1;i<=m;i++)
	{
		cin>>s;
		int x=read()+1,y=read()+1;
		if(s[0]=='C')C_pot(root,1,n,pos[x],y-1);
		else{
			if(x>y)swap(x,y);
			if(s[0]=='N')C_che(x,y);
			else if(s[0]=='S')printf("%d\n",Q_sum(x,y));
			else if(s[0]=='M'&&s[1]=='A')printf("%d\n",Q_max(x,y));
			e…

回复

17 条回复,欢迎继续交流。

正在加载回复...