\(\text{Problem}\)

我们有一个树,大小为 \(n\)。

考虑树上的一条路径,如果一个边的两个点都在这路径上,我们称这个边属于这个路径,如果一个边有且只有一个点在这路径上,我们称这个边与这个路径相邻。

现在每个边要么是黑色的要么是白色的,一开始所有边都是白色的。

我们有 \(3\) 个操作,将某路径反色,将与某路径相邻的所有边反色,求一个路径上黑边的总数。

\(\text{Solution}\)

第二个操作有点难。。。

从查询上想办法,发现树链剖分查询时跳过 \(O(log)\) 条重链和 \(O(log)\) 条轻边

启示我们维护一个点向下的重边有没有被反色过,向下的所有轻边有没有被反色过

显然需要线段树的区间修改

然后试着看能不能把操作不重不漏的修改完

发现还需要一个标记数组维护一个点向上的轻边有没有被反色过

查询过轻边时要结合标记数组和线段树信息弄出它真实的颜色

细节比较多

\(\text{Code}\)

#include <cstdio>
#include <iostream>
#define RE register
#define IN inline
#define ls (p << 1)
#define rs (ls | 1)
using namespace std; const int N = 1e5 + 5;
int n, m, a[N], h[N], tot;
struct edge{int nxt, to;}e[N << 1];
IN void add(int x, int y){e[++tot] = edge{h[x], y}, h[x] = tot;} int top[N], fa[N], dfn[N], siz[N], son[N], dep[N], dfc;
void dfs1(int x, int y)
{
siz[x] = 1, fa[x] = y, dep[x] = dep[y] + 1;
for(int i = h[x]; i; i = e[i].nxt)
{
int v = e[i].to;
if (v == y) continue;
dfs1(v, x), siz[x] += siz[v];
if (siz[son[x]] < siz[v]) son[x] = v;
}
}
void dfs2(int x, int t)
{
top[x] = t, dfn[x] = ++dfc;
if (son[x]) dfs2(son[x], t);
for(int i = h[x]; i; i = e[i].nxt)
{
int v = e[i].to;
if (v == fa[x] || v == son[x]) continue;
dfs2(v, v);
}
} int bz[N], sum[N * 4], tg1[N * 4], tg0[N * 4];
IN void push(int p, int l, int r){sum[p] = r - l + 1 - sum[p], tg1[p] ^= 1;}
IN void pushdown(int p, int l, int r)
{
int mid = l + r >> 1;
if (tg1[p]) push(ls, l, mid), push(rs, mid + 1, r), tg1[p] = 0;
if (tg0[p]) tg0[ls] ^= tg0[p], tg0[rs] ^= tg0[p], tg0[p] = 0;
}
void Modify(int p, int l, int r, int tl, int tr, int v)
{
if (tr < l || r < tl) return;
if (tl <= l && r <= tr){if (v) push(p, l, r); else tg0[p] ^= 1; return;}
pushdown(p, l, r);
int mid = l + r >> 1;
if (tl <= mid) Modify(ls, l, mid, tl, tr, v);
if (tr > mid) Modify(rs, mid + 1, r, tl, tr, v);
sum[p] = sum[ls] + sum[rs];
}
int Query(int p, int l, int r, int tl, int tr, int v)
{
if (tr < l || r < tl) return 0;
if (tl <= l && r <= tr) return (v ? sum[p] : tg0[p]);
pushdown(p, l, r);
int mid = l + r >> 1, res = 0;
if (tl <= mid) res = Query(ls, l, mid, tl, tr, v);
if (tr > mid) res += Query(rs, mid + 1, r, tl, tr, v);
return res;
} int main()
{
scanf("%d", &n);
for(RE int i = 1, x, y; i < n; i++) scanf("%d%d", &x, &y), add(x, y), add(y, x);
dfs1(1, 0), dfs2(1, 1), scanf("%d", &m);
for(RE int x, y, t, fx, fy; m; --m)
{
scanf("%d%d%d", &t, &x, &y), fx = top[x], fy = top[y];
if (t == 1)
{
while (fx ^ fy)
if (dep[fx] > dep[fy]) Modify(1, 1, n, dfn[fx], dfn[x] - 1, 1), bz[fx] ^= 1, x = fa[fx], fx = top[x];
else Modify(1, 1, n, dfn[fy], dfn[y] - 1, 1), bz[fy] ^= 1, y = fa[fy], fy = top[y];
if (x == y) continue;
if (dep[x] > dep[y]) swap(x, y); Modify(1, 1, n, dfn[x], dfn[y] - 1, 1);
}
else if (t == 2){
while (fx ^ fy)
if (dep[fx] > dep[fy])
Modify(1, 1, n, dfn[fx], dfn[x], 0), Modify(1, 1, n, dfn[x], dfn[x], 1), bz[fx] ^= 1, x = fa[fx], fx = top[x];
else Modify(1, 1, n, dfn[fy], dfn[y], 0), Modify(1, 1, n, dfn[y], dfn[y], 1), bz[fy] ^= 1, y = fa[fy], fy = top[y];
if (dep[x] > dep[y]) swap(x, y); Modify(1, 1, n, dfn[x], dfn[y], 0), Modify(1, 1, n, dfn[y], dfn[y], 1);
if (x == top[x]) bz[x] ^= 1; else Modify(1, 1, n, dfn[fa[x]], dfn[fa[x]], 1);
}
else{
t = 0;
while (fx ^ fy)
if (dep[fx] > dep[fy])
t += Query(1, 1, n, dfn[fx], dfn[x] - 1, 1) + (bz[fx] ^ Query(1, 1, n, dfn[fa[fx]], dfn[fa[fx]], 0)), x = fa[fx], fx = top[x];
else t += Query(1, 1, n, dfn[fy], dfn[y] - 1, 1) + (bz[fy] ^ Query(1, 1, n, dfn[fa[fy]], dfn[fa[fy]], 0)), y = fa[fy], fy = top[y];
if (x ^ y && dep[x] > dep[y]) swap(x, y); t += Query(1, 1, n, dfn[x], dfn[y] - 1, 1);
printf("%d\n", t);
}
}
}

JZOJ 3745. 【NOI2014模拟7.14】Problem A的更多相关文章

  1. JZOJ【NOIP2013模拟联考14】隐藏指令

    JZOJ[NOIP2013模拟联考14]隐藏指令 题目 Description 在d维欧几里得空间中,指令是一个长度为2N的串.串的每一个元素为d个正交基的方向及反方向之一.例如,d = 1时(数轴) ...

  2. JZOJ 【NOIP2017提高A组模拟9.14】捕老鼠

    JZOJ [NOIP2017提高A组模拟9.14]捕老鼠 题目 Description 为了加快社会主义现代化,建设新农村,农夫约(Farmer Jo)决定给农庄里的仓库灭灭鼠.于是,猫被农夫约派去捕 ...

  3. epel [Errno 14] problem making ssl connection

    问题描述: 执行yum命令时,报错[Errno 14] problem making ssl connection 问题分析: ssl证书问题 问题解决: sed -i 's/^#baseurl/ba ...

  4. linux下yum错误:[Errno 14] problem making ssl connection Trying other mirror.

    今天是要yum命令安装EPEL仓库后 yum install epel-release 突然发现yum安装其他的软件出错. 错误:[Errno 14] problem making ssl conne ...

  5. Centos 14: problem making ssl connection

    在执行 yum 命令时,会提示 Loaded plugins: fastestmirror Loading mirror speeds from cached hostfile Could not g ...

  6. JZOJ.5274【NOIP2017模拟8.14】数组

    Description

  7. JZOJ.5275【NOIP2017模拟8.14】水管

    Description

  8. JZOJ.5273【NOIP2017模拟8.14】亲戚

    Description

  9. JZOJ.3769【NOI2015模拟8.14】A+B

    Description 对于每个数字x,我们总可以把它表示成一些斐波拉切数字之和,比如8 = 5 + 3,  而22 = 21 + 1,因此我们可以写成  x = a1 * Fib1 + a2 * F ...

  10. [JZOJ]100047. 【NOIP2017提高A组模拟7.14】基因变异

    21 世纪是生物学的世纪,以遗传与进化为代表的现代生物理论越来越多的 进入了我们的视野. 如同大家所熟知的,基因是遗传因子,它记录了生命的基本构造和性能. 因此生物进化与基因的变异息息相关,考察基因变 ...

随机推荐

  1. 使用Typora

    Markdown学习 标题:#+空格+名称 二级标题 二级标题:##+空格+名称 三级标题 几级标题以此类推,最多支持到六级标题 字体 Hello,world! 变粗体:一句话的前后加上两个** 变斜 ...

  2. pandas中loc和iloc的使用细节

    1.缘由 前段时间在使用pandas库中的索引和切片的时候,突然就感觉有点懵,赋值和索引的操作总是报错. 网上的很多资料讲的也非常的浅显,而且使用起来非常不顺手. 于是我就找到很多的网上资料,然后自己 ...

  3. Python全栈工程师之从网页搭建入门到Flask全栈项目实战(7) - 在线问答系统

    1.项目源码/业务逻辑 百度网盘链接:链接:https://pan.baidu.com/s/13VNfrSJE6vcL3HP1J5T8ew 提取码:00s0,项目业务逻辑自行阅读 2.项目搭建 点击新 ...

  4. 浅聊一下Django如何避免xss攻击

    一.什么是xss攻击 xss攻击:----->web注入 xss跨站脚本攻击(Cross site script,简称xss)是一种"HTML注入",由于攻击的脚本多数时候是 ...

  5. vue 点击按钮添加一行dom节点

    如图,最近项目需求,点击添加一行dom节点,包含下拉框和input输入框 ,下面展示一下代码 <ul class="sales-menuItem-ul"> <li ...

  6. day11-功能实现10

    家居网购项目实现010 以下皆为部分代码,详见 https://github.com/liyuelian/furniture_mall.git 24.bugFix-添加购物车按钮动态处理 24.1需求 ...

  7. 【好软推荐】Scoop - Windows快速软件安装指南

    在平常生活中如果要安装像git.java.node这些环境的时都需要先去官网下载安装程序,点击安装,之后还需要配置,不仅过程麻烦,而且工具多了之后整理起来也相当不容易,配置也很杂,整个电脑就像被污染了 ...

  8. [1]SpinalHDL安装环境

    [1]SpinalHDL安装环境 最好的教程是官方文档!不过推荐英文文档 英文版 中文版 一.安装java环境 SpinalHDL相当于是scala的一个包,而scala是运行在jvm上的.所以我们先 ...

  9. 腾讯出品小程序自动化测试框架【Minium】系列(四)API详解(上)

    写在前面 不知道是不是因为之前出过书的原因,在写教程之类的文章,会潜意识有自带目录和章节的感觉在里面,有点说不出的感觉吧. 上篇文章我们介绍了关于元素定位的使用方法,这篇文章将为大家分享关于Miniu ...

  10. 动力节点—day05

    数组 Java语言当中的数组是一种引用数据类型,不属于基本数据类型,数组的父类是Object 数组实际上是一个容器,可以同时容纳多个元素(数组是一个数据集合),多个数据元素的类型必须是一致的 数组当中 ...