40pts,其余是TLE,求助
查看原帖
40pts,其余是TLE,求助
225292
xiaozuo_楼主2022/8/18 00:38
#include<bits/stdc++.h>
#define ll long long
#define ull unsigned long long
#define all(x) (x).begin(),(x).end
#define endl "\n"
#define lowbit(x) x&(-x)
#define fs(i,l,r) for(int i=(l);i<=(r);i++)
#define fp(i,r,l) for(int i=(r);i>=(l);i--)
#define max(a,b) ((a)>(b)? (a):(b))
#define min(a,b) ((a)<(b)? (a):(b))
#define at auto
#define X first
#define Y second
#define re return
#define ctu continue
#define pb push_back
#define YES cout<<"YES"<<endl
#define NO cout<<"NO"<<endl
#define dbug(x) cout<<"#"<<(x)<<endl
#define vct vector
#define SUM(a) accumulate(all(a), 0LL)
#define MIN(a) (*min_element(all(a)))
#define MAX(a) (*max_element(all(a)))
using namespace std;
typedef pair<int,int> P;
typedef double db;
typedef vector<int> VI;
const ll mod=1e9+7;
const int MAX_N=2e6+5;
const int MAX_D=1e9;
bool Cmp(int x,int y){return x>y;}
bool isprime(int n){if(n==1)return 0;for(int i=2;i<=sqrt(n);i++)if(n%i==0)return 0;return 1;}
int Num[MAX_N];void prime(int n){int p[MAX_N],cnt=0;for(int i=2;i<=n;i++){if(Num[i]==false)p[++cnt]=i;for(int j=1;j<=cnt&&i*p[j]<=n;j++){Num[i*p[j]]=true;if(i%p[j]==0)break;}}}//欧拉筛
ll gcd(ll a, ll b) {ll temp;if(a<b)swap(a,b);while(b!=0){temp=a%b;a=b;b=temp;}return a;}
ll lcm(ll a,ll b){return a*b/gcd(a,b);}
ll qpow(ll a,ll b){ll ans=1,base=a;while(b){if(b&1)ans=(ans*base)%mod;base=(base*base)%mod;b>>=1;}return ans;}//快速幂
ll t,n,m,a[MAX_N],k;
string s;
template < typename T >
inline void read(T &x){
	x = 0;bool flag = 1;char c = getchar();
	while(c < '0' or c > '9'){
		if(c == '-') flag = 0;
		c = getchar();
	}
	while(c >= '0' and c <= '9'){
		x = (x << 1) + (x << 3) + (c^48);	c = getchar();
	}
	x = (flag) ? x : -x ;
}
template < typename T >
void print(T x)
{
	if(x < 0){putchar('-'),x=-x;}
	if(x>9)print(x/10);
	putchar(int (x%10) + '0');
}
struct node
{
	int l,r,lz;
	int sum,minn,maxn;
}tr[MAX_N];
void update(int now)
{
	tr[now].sum=tr[now<<1].sum+tr[now<<1|1].sum;
	tr[now].maxn=max(tr[now<<1].maxn,tr[now<<1|1].maxn);
	tr[now].minn=min(tr[now<<1].minn,tr[now<<1|1].minn);
}
void build(int now,int l,int r)
{
	tr[now].l=l;
	tr[now].r=r;
	if(l==r)
	{
		tr[now].sum=tr[now].maxn=tr[now].minn=a[l];
		re;
	}
	int mid=l+r>>1;
	build(now<<1,l,mid);
	build(now<<1|1,mid+1,r);
	update(now);
}
void init_lz(int now)
{
	tr[now].lz=0;
}
void cal_lz(int now,int son)
{
	tr[son].sum=-tr[son].sum;
	swap(tr[son].maxn,tr[son].minn);
	tr[son].maxn*=-1;
	tr[son].minn*=-1;
}
void union_lz(int now,int son)
{
	tr[son].lz^=tr[now].lz;
}
void down(int now)
{
	if(tr[now].lz)
	{
		cal_lz(now,now<<1);
		cal_lz(now,now<<1|1);
		union_lz(now,now<<1);
		union_lz(now,now<<1|1);
		init_lz(now);
	}
}
void change1(int now,int p,int x)
{
	if(tr[now].l==tr[now].r)
	{
		tr[now].sum=tr[now].maxn=tr[now].minn=x;
		re;
	}
	down(now);
	int mid=tr[now].l+tr[now].r>>1;
	if(p<=mid)change1(now<<1,p,x);
	else change1(now<<1|1,p,x);
	update(now);
}
void change2(int now,int l,int r)
{
	if(tr[now].l>=l&&tr[now].r<=r)
	{
		tr[now].sum*=-1;
		swap(tr[now].maxn,tr[now].minn);
		tr[now].maxn*=-1;
		tr[now].minn*=-1;
		tr[now].lz^=1;
		re;
	}
	down(now);
	int mid=tr[now].l+tr[now].r>>1;
	if(l<=mid)change2(now<<1,l,r);
	if(mid<r)change2(now<<1|1,l,r);
	update(now);
}
int querysum(int now,int l,int r)
{
	if(tr[now].l>=l&&tr[now].r<=r)re tr[now].sum;	
	down(now);
	ll sum=0;
	int mid=tr[now].l+tr[now].r>>1;
	if(l<=mid)sum+=querysum(now<<1,l,r);
	if(mid<r)sum+=querysum(now<<1|1,l,r);
	re sum;
}
int querymax(int now,int l,int r)
{
	if(tr[now].l>=l&&tr[now].r<=r)re tr[now].maxn;	
	down(now);
	ll maxn=-1e9;
	int mid=tr[now].l+tr[now].r>>1;
	if(l<=mid)maxn=max(maxn,querymax(now<<1,l,r));
	if(mid<r)maxn=max(maxn,querymax(now<<1|1,l,r));
	re maxn;
}
int querymin(int now,int l,int r)
{
	if(tr[now].l>=l&&tr[now].r<=r)re tr[now].minn;	
	down(now);
	int mid=tr[now].l+tr[now].r>>1;
	ll minn=1e9;
	if(l<=mid)minn=min(minn,querymin(now<<1,l,r));
	if(mid<r)minn=min(minn,querymin(now<<1|1,l,r));
	re minn;
}
struct node2
{
	int to,next,w;
}e[MAX_N];
int head[MAX_N];
void add(int u,int v,int w)
{
	e[++k].to=v;
	e[k].w=w;
	e[k].next=head[u];
	head[u]=k;
}
int fa[MAX_N],siz[MAX_N],son[MAX_N],dep[MAX_N],w[MAX_N];
void dfs1(int now,int fath)
{
	fa[now]=fath;
	dep[now]=dep[fath]+1;
	siz[now]=1;
	son[now]=-1;
	for(int i=head[now];i;i=e[i].next)
	{
		if(e[i].to==fath)ctu;
		w[e[i].to]=e[i].w;		
		dfs1(e[i].to,now);
		siz[now]+=siz[e[i].to];
		if(son[now]==-1||siz[e[i].to]>siz[son[now]])
			son[now]=e[i].to;
	}
}
int top[MAX_N],id[MAX_N],cnt;
void dfs2(int now,int topf)
{
	top[now]=topf;
	id[now]=++cnt;
	a[cnt]=w[now];
	if(son[now]==-1)re;
	dfs2(son[now],topf);
	for(int i=head[now];i;i=e[i].next)
	{
		if(e[i].to==son[now]||e[i].to==fa[now])ctu;
		dfs2(e[i].to,e[i].to);
	}
}
void rchange1(int x,int y,int k)
{
	if(fa[y]==x)swap(x,y);
	change1(1,id[x],k);
}
void rchange2(int x,int y)
{
	while(top[x]!=top[y])
	{
		if(dep[top[x]]<dep[top[y]])swap(x,y);
		change2(1,id[top[x]],id[x]);
		x=fa[top[x]];
	}
	if(dep[x]>dep[y])swap(x,y);
	change2(1,id[x]+1,id[y]);	
}
ll qsum(int x,int y)
{
	ll sum=0;
	while(top[x]!=top[y])
	{
		if(dep[top[x]]<dep[top[y]])swap(x,y);
		sum+=querysum(1,id[top[x]],id[x]);
		x=fa[top[x]];
	}
	if(dep[x]>dep[y])swap(x,y);
	sum+=querysum(1,id[x]+1,id[y]);
	re sum;
}
int qmax(int x,int y)
{
	ll maxn=-1e9;
	while(top[x]!=top[y])
	{
		if(dep[top[x]]<dep[top[y]])swap(x,y);
		maxn=max(maxn,querymax(1,id[top[x]],id[x]));
		x=fa[top[x]];
	}
	if(dep[x]>dep[y])swap(x,y);
	maxn=max(maxn,querymax(1,id[x]+1,id[y]));
	re maxn;
}
int qmin(int x,int y)
{
	ll minn=1e9;
	while(top[x]!=top[y])
	{
		if(dep[top[x]]<dep[top[y]])swap(x,y);
		minn=min(minn,querymin(1,id[top[x]],id[x]));
		x=fa[top[x]];
	}
	if(dep[x]>dep[y])swap(x,y);
	minn=min(minn,querymin(1,id[x]+1,id[y]));
	re minn;
}
void work()
{
	read(n);
//	cin>>n;
	vector<P> E;
	int u,v,w;	
	fs(i,1,n-1)
	{
//		cin>>u>>v>>w;
		read(u);
		read(v);
		read(w);
		u++;
		v++;
		E.pb({u,v});
		add(u,v,w);
		add(v,u,w);
	}
	dfs1(1,1);
	dfs2(1,1);
	build(1,1,n);
//	cin>>m;
	int x,y;
	read(m);
	while(m--)
	{
		cin>>s;
		read(x);
		read(y);
//		cin>>s>>x>>y;
		if(s=="C")
			rchange1(E[x-1].X,E[x-1].Y,y);
		x++;
		y++;
		if(s=="N")
			rchange2(x,y);
		if(s=="SUM")
			print(qsum(x,y)),putchar('\n');
//			cout<<qsum(x,y)<<endl;
		if(s=="MAX")
			print(qmax(x,y)),putchar('\n');
//			cout<<qmax(x,y)<<endl;
		if(s=="MIN")
			print(qmin(x,y)),putchar('\n');
//			cout<<qmin(x,y)<<endl;
//		fs(i,1,n)
//			cout<<querysum(1,i,i)<<' ';
//		cout<<endl;
	}
}
int main()
{
//	freopen ("A.in", "r", stdin);
//	freopen ("A.out", "w", stdout);
//	std::ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
//	cin>>t;
//	while(t--)
		work();
	return 0;
}
2022/8/18 00:38
加载中...