AC #11 10 pts 求调。
查看原帖
AC #11 10 pts 求调。
1296826
lcfollower楼主2024/7/28 16:43

咕咕咕。。。

#include <bits/stdc++.h>
using namespace std;

#define int long long
#define infi 0x3f3f3f3f3f3f3f3fll
#define up(i,x,y) for(register int i=x;i<=y;++i)
#define dn(i,x,y) for(register int i=x;i>=y;--i)

using namespace std;

inline int read(){int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9')x=(x<<1)+(x<<3)+(ch^48),ch=getchar();return x*f;}
inline void write(int x){if(x<0)putchar('-'),x=-x;if(x>9)write(x/10);putchar(x%10|48);}
inline void writeln(int x){write(x),putchar('\n');}
inline void writesp(int x){write(x),putchar(' ');}

const int N = 2e5 + 10; 
struct node{int u ,v;}g[N];
struct Edge{int v ,len;Edge(int x ,int y){v = x ,len = y;}};
int mx[N] ,add[N] ,cov[N];
int top[N] ,id[N] ,sz[N] ,fa[N] ,son[N] ,dep[N] ,a[N] ,nw[N];
int n ,cnt;

vector <Edge> edge[N << 1];

inline void dfs1(int u ,int fath ,int len){
  fa[u]= fath ,dep[u] = dep[fath] + 1 ,sz[u] = 1 ,a[u] = len;
  for(int i = 0;i < edge[u].size();i ++)
    if(edge[u][i].v != fath){
      int v = edge[u][i].v;
	  dfs1(v ,u ,edge[u][i].len);
	  sz[u] += sz[v];
	  if(sz[son[u]] < sz[v]) son[u] = v;
    }
} inline void dfs2(int u ,int tp){
  top[u] = tp;
  id[u] = ++ cnt;
  nw[id[u]] = a[u];
  if(!son[u]) return;
  dfs2(son[u] , u);
  for(int i = 0;i < edge[u].size();i ++){
  	int v = edge[u][i].v;
    if(v == fa[u] || v == son[u]) continue;
	else dfs2(v, v);  	
  }

} inline void pushup(int u){mx[u] = max(mx[u << 1] ,mx[u << 1 | 1]); }
inline void pushdown(int u){
  if(cov[u] != -1){
  	add[u << 1] = add[u << 1 | 1] = -1;
  	mx[u << 1] = mx[u << 1 | 1] = cov[u];
  	cov[u << 1] = cov[u << 1 | 1] = cov[u];
  	cov[u] = -1;
  }
  if(add[u]){
  	add[u << 1] += add[u];
  	add[u << 1 | 1] += add[u];
  	mx[u << 1] += mx[u];
  	mx[u << 1 | 1] += mx[u];
  	add[u] = 0;
  }
} inline void build(int u ,int l ,int r){
  cov[u] = -1;
  if(l == r){mx[u] = nw[l];return;}
  int mid = ((l + r) >> 1ll);
  build(u << 1 ,l , mid);
  build(u << 1 | 1, mid + 1, r);
  pushup(u);
} inline void adds(int u ,int l ,int r ,int x ,int y ,int val){
  if(l >= x && r <= y){
  	mx[u] += val;
	add[u] += val;
	return; 
  }
  pushdown(u);
  int mid = ((l + r) >> 1ll);
  if(x <= mid) adds(u << 1 ,l ,mid ,x ,y ,val);
  if(mid < y) adds(u << 1 | 1 ,mid + 1 ,r ,x, y ,val);
  pushup(u);
} inline void change(int u ,int l ,int r ,int x, int y ,int val){
  if(l >= x && r <= y){add[u] = 0;mx[u] = cov[u] = val;return;}
  pushdown(u);
  int mid = ((l + r) >> 1ll);
  if(x <= mid) change(u << 1 ,l ,mid ,x ,y ,val);
  if(mid < y) change(u << 1 | 1 , mid + 1 ,r ,x , y ,val);
  pushup(u);
} inline int query(int u ,int l ,int r ,int x ,int y){
  if(l >= x && r <= y) return mx[u];
  pushdown(u);
  int mid = ((l + r) >> 1ll) ,res = 0;
  if(x <= mid) res = query(u << 1 , l ,mid ,x ,y);
  if(mid < y) res = max(res ,query(u << 1 | 1 ,mid + 1 ,r ,x ,y));
  return res; 
} inline void modify(int u ,int v ,int val ,bool op){
//op = 0,表示覆盖;op = 1,表示区间加。 
  while(top[u] != top[v]){
  	if(dep[top[u]] < dep[top[v]]) swap(u ,v);
  	if(!op) change(1, 1, n ,id[top[u]] ,id[u] ,val);
  	else adds(1 ,1, n ,id[top[u]] ,id[u] ,val);
  	u = fa[top[u]];
  }
  if(dep[u] > dep[v]) swap(u ,v);
  if(u == v) return;
  if(!op) change(1 ,1 ,n ,id[u] + 1 ,id[v] ,val);
  else adds(1 ,1 ,n ,id[u] + 1 ,id[v] ,val);
} inline int ask(int u ,int v){
  int res = 0;
  while(top[u] != top[v]){
  	if(dep[top[u]] < dep[top[v]]) swap(u ,v);
  	res = max(res ,query(1 ,1, n ,id[top[u]] ,id[u]));
  	u = fa[top[u]];
  }
  if(dep[u] > dep[v]) swap(u ,v);
  if(u == v) return res;
  return max(res ,query(1 ,1, n ,id[u] + 1 ,id[v]));
}
signed main(){
  n = read();
  up(i,1,n - 1){
  	int u = read() ,v = read() , w = read();
  	g[i] = {u ,v};
  	edge[u].push_back((Edge){v ,w});
	edge[v].push_back((Edge){u ,w});
  }
  dfs1(1 ,1 ,0);
  dfs2(1, 1);
 // up(i,1,n) writeln(top[i]);
  build(1,1,n);
 // up(i,1,n) writeln(top[i]);
  while(1){
  	char op[10];
  	cin >> op;
  	if(op[0] == 'S') break;
  	if(op[0] == 'C' && op[1] == 'h'){
  	  int i = read() ,v = read();
	  modify(g[i].u ,g[i].v ,v ,0);	
	} if(op[0] == 'C' && op[1] == 'o'){
	  int u = read() ,v = read() ,w = read();
	  modify(u ,v, w ,0);
	} if(op[0] == 'A'){
	  int u = read() ,v = read() ,w = read();
	  modify(u ,v, w ,1);
	} if(op[0] == 'M'){
	  int u = read() ,v = read();
	  writeln(ask(u ,v));
	}
  }
  return 0;
}
/*
3 5
1 2
3 4
2 2
1 5
1 4
*/
2024/7/28 16:43
加载中...