仍然是树剖模板题TT
线段树维护取反和最大值就同时维护最大最小值,取反时最大最小值取反交换即可
单点修改时记得把叶节点的lazy tag置0
1 #include<stdio.h> 2 int h[10010],nex[20010],va[10010],vb[10010],ev[20010],to[20010],v[10010],siz[10010],son[10010],fa[10010],dep[10010],bl[10010],pos[10010],tot,sz,M,Tmin[40010],Tmax[40010],laz[40010]; 3 void add(int a,int b,int v){ 4 tot++; 5 to[tot]=b; 6 ev[tot]=v; 7 nex[tot]=h[a]; 8 h[a]=tot; 9 } 10 void dfs(int x){ 11 siz[x]=1; 12 int mx=0,k=0,i; 13 for(i=h[x];i;i=nex[i]){ 14 if(to[i]!=fa[x]){ 15 fa[to[i]]=x; 16 v[to[i]]=ev[i]; 17 dep[to[i]]=dep[x]+1; 18 dfs(to[i]); 19 siz[x]+=siz[to[i]]; 20 if(siz[to[i]]>mx){ 21 mx=siz[to[i]]; 22 k=to[i]; 23 } 24 } 25 } 26 son[x]=k; 27 } 28 void dfs(int x,int chain){ 29 bl[x]=chain; 30 sz++; 31 pos[x]=sz; 32 if(son[x])dfs(son[x],chain); 33 for(int i=h[x];i;i=nex[i]){ 34 if(to[i]!=fa[x]&&to[i]!=son[x])dfs(to[i],to[i]); 35 } 36 } 37 void pushdown(int x){ 38 if(laz[x]){ 39 int t=Tmin[x<<1]; 40 Tmin[x<<1]=-Tmax[x<<1]; 41 Tmax[x<<1]=-t; 42 t=Tmin[x<<1|1]; 43 Tmin[x<<1|1]=-Tmax[x<<1|1]; 44 Tmax[x<<1|1]=-t; 45 laz[x]=0; 46 laz[x<<1]^=1; 47 laz[x<<1|1]^=1; 48 } 49 } 50 int min(int a,int b){return a<b?a:b;} 51 int max(int a,int b){return a>b?a:b;} 52 void pushup(int x){ 53 Tmin[x]=min(Tmin[x<<1],Tmin[x<<1|1]); 54 Tmax[x]=max(Tmax[x<<1],Tmax[x<<1|1]); 55 } 56 void modify(int L,int R,int l,int r,int x){ 57 if(L<=l&&r<=R){ 58 laz[x]^=1; 59 l=Tmin[x]; 60 Tmin[x]=-Tmax[x]; 61 Tmax[x]=-l; 62 return; 63 } 64 pushdown(x); 65 int mid=(l+r)>>1; 66 if(L<=mid)modify(L,R,l,mid,x<<1); 67 if(R>mid)modify(L,R,mid+1,r,x<<1|1); 68 pushup(x); 69 } 70 void swap(int&a,int&b){a^=b^=a^=b;} 71 void modify(int x,int y){ 72 while(bl[x]!=bl[y]){ 73 if(dep[bl[x]]<dep[bl[y]])swap(x,y); 74 modify(pos[bl[x]],pos[x],1,M,1); 75 x=fa[bl[x]]; 76 } 77 if(x==y)return; 78 if(pos[x]>pos[y])swap(x,y); 79 modify(pos[x]+1,pos[y],1,M,1); 80 } 81 int querymax(int L,int R,int l,int r,int x){ 82 if(L<=l&&r<=R)return Tmax[x]; 83 pushdown(x); 84 int mid=(l+r)>>1,ans=-2147483647; 85 if(L<=mid)ans=max(ans,querymax(L,R,l,mid,x<<1)); 86 if(R>mid)ans=max(ans,querymax(L,R,mid+1,r,x<<1|1)); 87 return ans; 88 } 89 int getmax(int x,int y){ 90 int ans=-1061109567; 91 while(bl[x]!=bl[y]){ 92 if(dep[bl[x]]<dep[bl[y]])swap(x,y); 93 ans=max(ans,querymax(pos[bl[x]],pos[x],1,M,1)); 94 x=fa[bl[x]]; 95 } 96 if(x==y)return ans; 97 if(pos[x]>pos[y])swap(x,y); 98 return max(ans,querymax(pos[x]+1,pos[y],1,M,1)); 99 } 100 void modifys(int pos,int v,int l,int r,int x){ 101 if(l==r){ 102 Tmax[x]=Tmin[x]=v; 103 laz[x]=0; 104 return; 105 } 106 pushdown(x); 107 int mid=(l+r)>>1; 108 if(pos<=mid) 109 modifys(pos,v,l,mid,x<<1); 110 else 111 modifys(pos,v,mid+1,r,x<<1|1); 112 pushup(x); 113 } 114 int main(){ 115 int t,i,n,a,b; 116 char s[10]; 117 scanf("%d",&t); 118 while(t--){ 119 scanf("%d",&n); 120 tot=sz=0; 121 for(i=1;i<=n;i++)h[i]=0; 122 for(i=1;i<n;i++){ 123 scanf("%d%d%d",va+i,vb+i,&a); 124 add(va[i],vb[i],a); 125 add(vb[i],va[i],a); 126 } 127 dfs(1); 128 dfs(1,1); 129 for(M=1;M<n+2;M<<=1); 130 for(i=0;i<(M<<1);i++){ 131 Tmax[i]=-2147483647; 132 Tmin[i]=2147483647; 133 laz[i]=0; 134 } 135 for(i=1;i<=n;i++)Tmax[pos[i]+M-1]=Tmin[pos[i]+M-1]=v[i]; 136 for(i=M-1;i>0;i--)pushup(i); 137 scanf("%s",s); 138 while(s[0]!=‘D‘){ 139 scanf("%d%d",&a,&b); 140 if(s[0]==‘Q‘)printf("%d\n",getmax(a,b)); 141 if(s[0]==‘N‘)modify(a,b); 142 if(s[0]==‘C‘){ 143 if(fa[va[a]]==vb[a]) 144 modifys(pos[va[a]],b,1,M,1); 145 else 146 modifys(pos[vb[a]],b,1,M,1); 147 } 148 scanf("%s",s); 149 } 150 } 151 }
时间: 2024-11-14 11:09:47