QOJ.ac

QOJ

ID提交记录ID题目HackerOwner结果提交时间测评时间
#1552#891315#9918. Master of Both VIWanyejryggsFailed.2025-02-09 18:49:502025-02-09 18:49:50

詳細信息

Extra Test:

Accepted
time: 5ms
memory: 42832kb

input:

1 6
A 1 1 2
A 1 1 1
A 1 1 1
A 1 1 1
A 1 1 1
D 1 2

output:

2

result:

ok 1 number(s): "2"

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#891315#9918. Master of Both VIjryggsAC ✓1069ms490164kbC++143.2kb2025-02-09 13:04:062025-02-09 13:04:07

answer

#include <bits/stdc++.h>
using namespace std;
const int N=5e5+5;
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<<3)+(x<<1)+(ch^48),ch=getchar();
	return x*f;
}
int n,q,d[N],f[20][N<<1],cnt,dfn[N],fa[N],root[N],tot,ans,lim,res[N];
struct matrix{
	long long f[2][2];
	inline matrix operator*(const matrix b){
		matrix c;
		c.f[0][0]=min(f[0][0]+b.f[0][0],f[0][1]+b.f[1][0]);
		c.f[0][1]=min(f[0][0]+b.f[0][1],f[0][1]+b.f[1][1]);
		c.f[1][0]=min(f[1][0]+b.f[0][0],f[1][1]+b.f[1][0]);
		c.f[1][1]=min(f[1][0]+b.f[0][1],f[1][1]+b.f[1][1]);
		return c;
	}
}now;
vector<int>e[N];
inline void dfs1(int x){
	f[0][++cnt]=x;dfn[x]=cnt;
	for(auto y : e[x]){
		if(y!=fa[x])fa[y]=x,d[y]=d[x]+1,dfs1(y),f[0][++cnt]=x;
	}
}
inline int lca(int x,int y){
	x=dfn[x],y=dfn[y];
	if(x>y)swap(x,y);
	int k=__lg(y-x+1);
	if(d[f[k][x]]<d[f[k][y-(1<<k)+1]])return f[k][x];
	return f[k][y-(1<<k)+1];
}
char op[5];
vector<pair<int,int>>v[N],w[N];
struct tree{
	int lc,rc,siz;
	matrix a;
}t[N*20];
#define mid (l+r>>1)
inline void up(int p){
	t[p].a=t[t[p].lc].a*t[t[p].rc].a;
	t[p].siz=t[t[p].lc].siz+t[t[p].rc].siz;
}
inline void insert(int&p,int l,int r,int pos,int v){
	if(!p)p=++tot;
	if(l==r){
		if(v){
			t[p].siz=1,t[p].a.f[0][0]=t[p].a.f[1][0]=v,t[p].a.f[0][1]=v/2;t[p].a.f[1][1]=1e18;
		}
		else{
			t[p].siz=0;t[p].a.f[0][0]=t[p].a.f[1][1]=0;t[p].a.f[0][1]=t[p].a.f[1][0]=1e18;
		}
		return;
	}
	if(pos<=mid)insert(t[p].lc,l,mid,pos,v);
	else insert(t[p].rc,mid+1,r,pos,v);
	up(p);
}
inline void query(int p,int l,int r,int pos){
	if(r<=pos){
		auto g = t[p].a*now;
		for(int i = 0;i<2;i++)for(int j = 0;j<2;j++)if(g.f[i][j]<lim){
			// if(pos==4)cerr<<"?"<<l<<' '<<r<<' '<<t[p].siz<<' '<<i<<' '<<j<<' '<<g.f[i][j]<<endl;
			ans+=t[p].siz;
			now=g;
			return;
		}
	}
	if(l==r){
		lim=0;
		return;
	}
	if(pos>mid)query(t[p].rc,mid+1,r,pos);
	if(lim)query(t[p].lc,l,mid,pos);
	if(r<=pos)lim=0;
}
inline int merge(int p,int q,int l,int r){
	if(!p||!q)return p|q;
	if(l==r)return p;
	t[p].lc=merge(t[p].lc,t[q].lc,l,mid),t[p].rc=merge(t[p].rc,t[q].rc,mid+1,r);
	up(p);
	return p;
}
#undef mid
inline void dfs2(int x){
	for(auto y : e[x])if(y!=fa[x])dfs2(y),root[x]=merge(root[x],root[y],1,q);
	for(auto[i,y]:v[x]){
		insert(root[x],1,q,i,y);
	}
	for(auto[i,y]:w[x]){
		lim=y;
		ans=0;
		now.f[0][0]=now.f[1][1]=0,now.f[0][1]=now.f[1][0]=1e18;
		query(root[x],1,q,i);
		res[i]=ans;
	}
}
int main(){
	// freopen(".in","r",stdin);
	// freopen(".out","w",stdout);
	t[0].a.f[0][0]=t[0].a.f[1][1]=0;t[0].a.f[0][1]=t[0].a.f[1][0]=1e18;
	n=read(),q=read();
	for(int i = 1,x,y;i<n;i++)x=read(),y=read(),e[x].push_back(y),e[y].push_back(x);
	dfs1(1);
	for(int j = 1;j<=__lg(cnt);j++){
		for(int i = 1;i+(1<<j)-1<=cnt;i++){
			if(d[f[j-1][i]]<d[f[j-1][i+(1<<j-1)]])f[j][i]=f[j-1][i];
			else f[j][i]=f[j-1][i+(1<<j-1)];
		}
	}
	int x,y,z;
	for(int i = 1;i<=q;i++){
		scanf("%s",op);x=read(),y=read();
		if(op[0]=='A')z=read()*2,v[x].push_back({i,z}),v[y].push_back({i,z}),v[fa[lca(x,y)]].push_back({i,0}),res[i]=-1;
		else w[x].push_back({i,y*2});
	}
	dfs2(1);
	for(int i = 1;i<=q;i++)if(res[i]>=0)printf("%d\n",res[i]);
	return 0;
}