社区讨论
震惊,某萌新刚学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 条回复,欢迎继续交流。
正在加载回复...