题解:

这一道题目和模板有不同的地方就是在于可以修改只有一条边和i相邻

于是我们还要记录与这个点相邻的点有没有改变

代码:

#pragma GCC optimize(2)
#include<bits/stdc++.h>
const int N=;
using namespace std;
int fi[N],zz[N],ne[N],deep[N],fa[N],size[N],son[N],top[N];
int x,y,opt,pos[N],q[N],cnt,h[N],tot,n,m,T;
struct data
{
int w,b,delta,rev;
}tr[N*];
void add(int x,int y)
{
ne[++tot]=fi[x];
fi[x]=tot;
zz[tot]=y;
}
void dfs(int x,int f)
{
size[x]=; son[x]=;
deep[x]=deep[f]+;
for (int i=fi[x];i;i=ne[i])
{
if (zz[i]==f) continue;
fa[zz[i]]=x;
dfs(zz[i],x);
size[x]+=size[zz[i]];
if (size[zz[i]]>size[son[x]]) son[x]=zz[i];
}
}
void dfs1(int x,int y)
{
pos[x]=++cnt;q[cnt]=x;top[x]=y;
if (!son[x])return;
dfs1(son[x],y);
for (int i=fi[x];i;i=ne[i])
if (zz[i]!=son[x]&&zz[i]!=fa[x])
dfs1(zz[i],zz[i]);
}
void update(data &now,data l,data r)
{
now.w=l.w+r.w;
now.b=l.b+r.b;
}
void clear(int now)
{
tr[now].b=tr[now].w=tr[now].rev=tr[now].delta=;
}
void build(int now,int l,int r)
{
clear(now);
if (l==r)
{
tr[now].b=;
if (l!=) tr[now].w=;
return;
}
int mid=(l+r)/;
build(now<<,l,mid);
build(now<<|,mid+,r);
update(tr[now],tr[now<<],tr[now<<|]);
}
void change(int now)
{
swap(tr[now].w,tr[now].b);
tr[now].delta^=;
}
void pushdown(int now)
{
if (tr[now].delta)
{
change(now<<);
change(now<<|);
tr[now].delta=;
}
if (tr[now].rev)
{
tr[now<<].rev^=; tr[now<<|].rev^=;
tr[now].rev=;
}
}
data query(int now,int l,int r,int ll,int rr)
{
if (ll<=l&&r<=rr) return tr[now];
pushdown(now);
int mid=(l+r)/;data ans;int pd=;
if (ll<=mid) ans=query(now<<,l,mid,ll,rr),pd=;
if (rr>mid)
{
if (pd) update(ans,ans,query(now<<|,mid+,r,ll,rr));
else ans=query(now<<|,mid+,r,ll,rr);
}
return ans;
}
void qjchange(int now,int l,int r,int ll,int rr)
{
if (ll<=l&&r<=rr)
{
change(now);
return;
}
int mid=(l+r)/;
pushdown(now);
if (ll<=mid) qjchange(now<<,l,mid,ll,rr);
if (rr>mid) qjchange(now<<|,mid+,r,ll,rr);
update(tr[now],tr[now<<],tr[now<<|]);
}
void reverse(int now,int l,int r,int ll,int rr)
{
if (ll<=l&&r<=rr)
{
tr[now].rev^=;
return;
}
pushdown(now);
int mid=(l+r)/;
if (ll<=mid) reverse(now<<,l,mid,ll,rr);
if (rr>mid) reverse(now<<|,mid+,r,ll,rr);
update(tr[now],tr[now<<],tr[now<<|]);
}
void solve(int x,int y)
{
while (top[x]!=top[y])
{
if (deep[top[x]]<deep[top[y]]) swap(x,y);
qjchange(,,n,pos[top[x]],pos[x]);
x=fa[top[x]];
}
if (deep[x]>deep[y]) swap(x,y);
if (x==y) return;
qjchange(,,n,pos[x]+,pos[y]);
}
void paint(int x,int y)
{
bool pd=false;
int t=;
while (top[x]!=top[y])
{
if (deep[top[x]]<deep[top[y]]) swap(x,y);
reverse(,,n,pos[top[x]],pos[x]);
if (son[x]) qjchange(,,n,pos[son[x]],pos[son[x]]);
qjchange(,,n,pos[top[x]],pos[top[x]]);
t=top[x]; x=fa[top[x]]; h[x]=t;
}
if (deep[x]>deep[y]) swap(x,y);
reverse(,,n,pos[x],pos[y]);
qjchange(,,n,pos[x],pos[x]);
if (son[y]) qjchange(,,n,pos[son[y]],pos[son[y]]);
}
int find(int now,int l,int r,int x)
{
if (x==) return ;
if (l==r) return tr[now].rev;
int mid=(l+r)/;
pushdown(now);
if (x<=mid) return find(now<<,l,mid,x);
else return find(now<<|,mid+,r,x);
}
int calc(int x,int y)
{
int ans=;
while (top[x]!=top[y])
{
if (deep[top[x]]<deep[top[y]]) swap(x,y);
data t=query(,,n,pos[top[x]],pos[x]);
data t1=query(,,n,pos[top[x]],pos[top[x]]);
int k=find(,,n,pos[fa[top[x]]]);
if (t1.b==&&k) t.b--;
if (t1.w==&&k) t.b++;
ans+=t.b;
x=fa[top[x]];
}
if (deep[x]>deep[y]) swap(x,y);
if (x==y) return ans;
data t=query(,,n,pos[x]+,pos[y]);
return ans+t.b;
}
int main()
{
scanf("%d",&T);
while (T--)
{
tot=cnt=;
memset(fi,,sizeof fi);
scanf("%d",&n);
for (int i=;i<n;i++)
{
scanf("%d%d",&x,&y);
add(x,y);add(y,x);
}
dfs(,);dfs1(,);build(,,n);
scanf("%d",&m);
while (m--)
{
scanf("%d%d%d",&opt,&x,&y);
if (opt==) solve(x,y);
if (opt==) paint(x,y);
if (opt==) printf("%d\n",calc(x,y));
}
}
return ;
}

bzoj3862的更多相关文章

  1. BZOJ3862 Little Devil I 树链剖分

    原文链接http://www.cnblogs.com/zhouzhendong/p/8081514.html 题目传送门 - BZOJ3862 题意概括 一棵树,n个点,边权为黑或者白,支持3重操作: ...

随机推荐

  1. Tickets---hdu1260 (简单dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1260 题意就是有n个人排队买票,每个人需要的时间是a[i] (1=< i <=N),但是现 ...

  2. mysql 约束条件 not null与default

    not null与default 是否可空,null表示空,非字符串not null - 不可空null - 可空 use db4: 默认值,创建列时可以指定默认值,当插入数据时如果未主动设置,则自动 ...

  3. mysql 数据操作 单表查询 group by 介绍

    group by 是在where 之后运行 在写单表查询语法的时候 应该把group by 写在 where 之后 执行顺序 1.先找到表 from 库.表名 2.按照where 约束条件 过滤你想要 ...

  4. ISCC2016-BASIC、WEB、MISC简单writeup

    RE和PWN题目的wp有大神已经放出来了,我也不擅长,就不搬了.bin求带. BASIC BASIC-1 50 仿射函数,百度“仿射加密法”,它讲的够清楚了. BASIC-2 50 结尾的“=”这个特 ...

  5. C#让应用程序只运行一个实例的几种方法

    一 判断是否有相同的实例已经运行 1 根据“Mutex”判断是否有相同的实例在运行 /// <returns>已有实例运行返回true,否则为false</returns>pu ...

  6. 72. Edit Distance(编辑距离 动态规划)

    Given two words word1 and word2, find the minimum number of operations required to convert word1 to  ...

  7. oracle中 start with .. connect by prior.. 用法简介

    我们经常会将一个比较复杂的目录树存储到一个表中.或者将一些部门存储到一个表中,而这些部门互相有隶属关系.这个时候你就会用到connect by prior start with.oracle 提供了s ...

  8. MySQL基准测试工具--sysbench

    我们需要知道的是sysbench并不是一个压力测试工具,是一个基准测试工具.linux自带的版本比较低,我们需要自己安装sysbench. [root@test2 ~]# sysbench --ver ...

  9. Python3.6(windows系统)通过pip安装bs4

    Python3.6(windows系统)通过pip安装bs4 cmd安装命令: pip install beautifulsoup4 执行结果:

  10. 2017-2018-1 JaWorld 第八周作业

    2017-2018-1 JaWorld 第八周作业 团队分工 成员 分工 陈是奇 统计成员工具选择 马平川 类图 王译潇 编码规范 李昱兴 用例图 林臻 状态图 张师瑜 推进工作进展.写博客 UML ...