WA 40pts求助
  • 板块P3401 洛谷树
  • 楼主233L
  • 当前回复1
  • 已保存回复1
  • 发布时间2022/8/20 22:38
  • 上次更新2023/10/27 14:22:17
查看原帖
WA 40pts求助
405894
233L楼主2022/8/20 22:38

已知操作1写挂了(因为没有2操作的点也WA了),但实在不知道哪写错了qwq

提交记录

#include<bits/stdc++.h>
#define ls(id) (id<<1)
#define rs(id) (id<<1|1)
#define ll long long
#define N 30004
#define W 10
using namespace std;
int n,q,cnt;
struct side{
	int v,w;
};
vector<side>g[N];
int w_[N],a[N];
int dep[N],fa[N],siz[N],son[N];
int num[N],wt[N],top[N];
struct data{
	int a[W][2];
	inline void init(int x){
		for(int i=0;i<W;i++,x>>=1)a[i][x&1]=1;
	}
	inline void update(int x){
		for(int i=0;i<W&&x;i++,x>>=1)
			if(x&1)swap(a[i][0],a[i][1]);
	}
}emp;
inline data operator+(const data &x,const data &y){
	data res=emp;
	for(int i=0;i<W;i++){
		res.a[i][0]=x.a[i][0]+y.a[i][0];
		res.a[i][1]=x.a[i][1]+y.a[i][1];
	}
	return res;
}
struct node{
	int l,r,tag;
	data dx;
}st[N<<2];

inline int read(){
	int x=0;
	char ch=getchar();
	while(!isdigit(ch))ch=getchar();
	while(isdigit(ch)){
		x=(x<<1)+(x<<3)+(ch&15);
		ch=getchar();
	}
	return x;
}
void dfs1(int id,int f){
	dep[id]=dep[f]+1;
	fa[id]=f,siz[id]=1;
	int maxn=0;
	for(side i:g[id]){
		if(i.v==f)continue;
		w_[i.v]=w_[id]^i.w;
		a[i.v]=i.w;
		dfs1(i.v,id);
		if(siz[i.v]>maxn)
			maxn=siz[i.v],son[id]=i.v;
		siz[id]+=siz[i.v];
	}
}
void dfs2(int id,int tp){
	num[id]=++cnt;
	wt[cnt]=w_[id];
	top[id]=tp;
	if(!son[id])return;
	dfs2(son[id],tp);
	for(side i:g[id])
		if(i.v!=son[id]&&i.v!=fa[id])dfs2(i.v,i.v);
}
inline void push_up(int id){
	st[id].dx=st[ls(id)].dx+st[rs(id)].dx;
}
inline void make_tag(int id,int tag){
	st[id].tag^=tag;
	st[id].dx.update(tag);
}
inline void push_down(int id){
	if(!st[id].tag)return;
	make_tag(ls(id),st[id].tag);
	make_tag(rs(id),st[id].tag);
	st[id].tag=0;
}
void build(int id,int l,int r){
	st[id]={l,r};
	if(l==r){
		st[id].dx.init(wt[l]);
		return;
	}
	int mid=(l+r)>>1;
	build(ls(id),l,mid);
	build(rs(id),mid+1,r);
	push_up(id);
}
void update(int id,int l,int r,int val){
	if(st[id].l>r||st[id].r<l)return;
	if(l<=st[id].l&&st[id].r<=r){
		make_tag(id,val);
		return;
	}
	push_down(id);
	update(ls(id),l,r,val);
	update(rs(id),l,r,val);
	push_up(id);
}
data query(int id,int l,int r){
	if(st[id].l>r||st[id].r<l)return emp;
	if(l<=st[id].l&&st[id].r<=r)return st[id].dx;
	push_down(id);
	return query(ls(id),l,r)+query(rs(id),l,r);
}
void range_update(int x,int z){
	update(1,num[x],num[x]+siz[x]-1,z);
}
ll path_query(int x,int y){
	data sum=emp;
	ll res=0;
	while(top[x]!=top[y]){
		if(dep[top[x]]<dep[top[y]])swap(x,y);
		sum=sum+query(1,num[top[x]],num[x]);
		x=fa[top[x]];
	}
	if(num[x]>num[y])swap(x,y);
	sum=sum+query(1,num[x],num[y]);
	for(int i=0;i<W;i++)res+=(1ll<<i)*sum.a[i][0]*sum.a[i][1];
	return res;
}
int main(){
	int u,v,w,op,x;
	n=read(),q=read();
	for(int i=1;i<n;i++){
		u=read (),v=read(),w=read();
		g[u].push_back({v,w});
		g[v].push_back({u,w});
	}
	dfs1(1,0);
	dfs2(1,1);
	build(1,1,n);
	
	while(q--){
		op=read(),u=read(),v=read();
		if(op==1)
			printf("%lld\n",path_query(u,v));
		else{
			w=read();
			if(fa[v]!=u)swap(u,v);
			a[v]^=w;
			range_update(v,a[v]);
		}
	}
}
2022/8/20 22:38
加载中...