省选成功成为河北B队队长QAQ 真是忧桑

所以在cojs上出了一套鬼畜的关于树的套题

黑白树:

我们先不考虑R操作

设x是u的祖先,那么fa(x)的贡献显然是 fa(x)*(sz(fa(x))-sz(x))

之后我们对于这个求和就是答案辣

然而这一脸不可做,我们化简一下,考虑每个sz(x)的贡献

sz(x)的贡献化简后可以发现 为 (x-fa(x))*sz(x)

然后我们就很容易用树链剖分完成更改和查询操作啦

之后我们考虑R操作

因为树上距离公式为 dis(u)+dis(v)-2*dis(lca(u,v))

最后一项为偶数,显然对奇偶性没有影响

那么当dis(u)为奇数时,这个操作等价于将所有dis值为偶数的点翻转

dis(u)为偶数时同理

又注意到对于R操作最多只会有4种形态

奇偶都不翻,奇偶都翻,奇翻偶不翻,奇不翻偶翻

不妨建立四颗线段树分别维护这四种形态

每次更改将四颗线段树都更改,查询在对应情况下查询即可

这样R操作我们可以O(1)的更换查询的线段树进而完成更改

树黑白:

这套题中最水的一道 目前为止我知道两种做法

第一种做法是动态点分治

对于每一层的重心维护子树中黑点到他的距离和和子树黑点个数

还要维护子树中黑点到他父亲的距离

这样每次查询我们只需要加上当前层的贡献,减去父亲层的贡献就可以啦

更改的时候暴力更改相关的子树就可以了

第二种做法是树链剖分

树上距离公式dis(u)+dis(v)-2*dis(lca(u,v))

显然sigma(dis(u))和tot*dis(v)我们都是已知量

问题就变成了维护dis(lca(u,v))

我们考虑每条边的贡献,设这条边的边权为w,儿子一端为x

那么贡献就是w*sz(x)

用树链剖分维护即可,做法跟黑白树差不多

树白黑:

首先我们考虑如果没有[L,R]的做法

我们可以用DFS序+树状数组维护子树和

每次修改单点加减

之后对于查询我们从查询点向上倍增

跳到离u最近的祖先且子树和不为0的位置

这个位置显然就是答案

之后我们发现子树和是具有可减性的

那么做法就很显然了,用DFS序+主席树维护

继续沿用上面的做法就可以了

白黑树:

数据很难做,最后也做得不是很成功

我们考虑树链剖分

对于每次修改,我们可以将u到根节点所有值+1或者-1

这样我们会发现父亲节点的值一定>=孩子节点的值

而当父亲节点的值>孩子节点的值的时候,显然存在一个黑点和当前点的LCA为这个父亲节点

我们定义这样的情况为一个分界点,那么显然我们要求的是深度最小的分界点

可以发现这个分界点一定是u到根节点路径中的最大值的位置

当然值相同的点我们要取深度较大的点

之后我们就可以利用树链剖分完成链修改和链查询了

UPD_1:神一样的lyc提供了一种更好的做法

我们会发现深度最小的LCA的子树一定恰好包含所有黑点

那么问题就是求离u最近的包含所有的黑点的祖先

跟树白黑一样倍增即可

UPD_2:这样子的话和树白黑一样也可以加大这道题目的难度

可以把解法变成主席树之类的奇怪的东东

不过数据就更加难出了,所以还是这样子吧

cojs 自己出的题目 解题报告的更多相关文章

  1. cojs 简单的区间问题 解题报告

    新学了些弦图和区间图的新玩意,于是就想着出一道题目 其实这道题不用弦图和区间图的理论也是可以做的 首先考虑第一问,第一问是一个NOIP普及组水平的贪心 我们把区间按照右端点从小到大排序,之后从头到尾扫 ...

  2. cojs 疯狂的求和问题 解题报告

    QAQ 好久不在cojs上出题了 最近学了点新科技,于是就做成题来分享了 这道题是要求simga(i^k) 那么就先说说部分分的算法吧: 10分: 直接暴力就可以了,时间复杂度O(nlogk) 30分 ...

  3. cojs 简单的求和问题 解题报告

    一个上午写了两个数据生成器,三个暴力和两个正解以及一个未竣工的伪正解思路 真是累死本宝宝了 首先这个题目暴力我的数据是有很多良心分的 但是不同的暴力拿到的分数也会有所差距,由于是题解就不说暴力怎么写了 ...

  4. cogs 自己出的题目 题解报告

    第一题很简单嘛,就是裸的动态树分治嘛 对于每一层的重心维护子树路径的信息和子树到上一层重心的点的信息 空间复杂度O(nlogn) 对于每一层我们按dis排序,之后记录军队数量的前缀和 查询的时候我们只 ...

  5. leetcode并发题目解题报告JAVA版

    一.Print in Order Suppose we have a class: public class Foo { public void first() { print("first ...

  6. 【九度OJ】题目1026:又一版 A+B 解题报告

    [九度OJ]题目1026:又一版 A+B 解题报告 标签(空格分隔): 九度OJ 原题地址:http://ac.jobdu.com/problem.php?pid=1026 题目描述: 输入两个不超过 ...

  7. 【九度OJ】题目1124:Digital Roots 解题报告

    [九度OJ]题目1124:Digital Roots 解题报告 标签(空格分隔): 九度OJ 原题地址:http://ac.jobdu.com/problem.php?pid=1124 题目描述: T ...

  8. 【九度OJ】题目1064:反序数 解题报告

    [九度OJ]题目1064:反序数 解题报告 标签(空格分隔): 九度OJ 原题地址:http://ac.jobdu.com/problem.php?pid=1064 题目描述: 设N是一个四位数,它的 ...

  9. 【九度OJ】题目1183:守形数 解题报告

    [九度OJ]题目1183:守形数 解题报告 标签(空格分隔): 九度OJ 原题地址:http://ac.jobdu.com/problem.php?pid=1183 题目描述: 守形数是这样一种整数, ...

随机推荐

  1. html5 app开发重大消息-腾讯在技术端推进Html5生态发展

    中新网5月3日电 日前,腾讯正式发布腾讯浏览服务(Tencent Browser Service,以下简称TBS),宣布为合作伙伴提供整合腾讯底层技术.内容框架.广告体系以及大数据等多方面能力的升级浏 ...

  2. 从一个URL下载原始数据,基于byte字节,得到byte数组

    public static byte[] loadRawDataFromURL(String u) throws Exception { URL url = new URL(u); HttpURLCo ...

  3. 如果在配置中将“system.serviceModel/serviceHostingEnvironment/multipleSiteBindingsEnabled”设置为 true,则需要终结点指定相对地址。如果在终结点上指定相对侦听 URI,则该地址可以是绝对地址。若要解决此问题,请为终结点“http://localhost/Service1.svc”指定相对 URI。

    问题: 如果在配置中将"system.serviceModel/serviceHostingEnvironment/multipleSiteBindingsEnabled"设置为 ...

  4. c++异常详解

    一.什么是异常处理 一句话:异常处理就是处理程序中的错误. 二.为什么需要异常处理,以及异常处理的基本思想 C++之父Bjarne Stroustrup在<The C++ Programming ...

  5. JS类库函数收集中....

    实现string的substring方法 方法一:用charAt取出截取部分 String.prototype.mysubstring=function(beginIndex,endIndex){ v ...

  6. Mysql ERROR 1045 (28000): Access denied for user 'root'@'localhost'(using password: YSE)

    安装mysql后,使用命令登录mysql居然报错了,Mysql ERROR 1045 (28000): Access denied for user 'root'@'localhost'(using ...

  7. 基础才是重中之重~理解linq中的groupby

    linq将大部分SQL语句进行了封装,这使得它们更加面向对象了,对于开发者来说,这是一件好事,下面我从基础层面来说一下GroupBy在LINQ中的使用. 对GroupBy的多字段分组,可以看我的这篇文 ...

  8. Java工程转换为Maven工程-b

    1. 前言 在开发中经常要建立一个Maven的子工程,对于没有模板的同学来说从Java工程来转换也是一个不错的选择.本文就如何从一个Java工程创建一个Maven工程做了一个介绍,相信对于将一个Jav ...

  9. WinForm程序界面假死,寻求完美解决方案

    故事的开端是这样的,小白是一个程序员,他确实也是一个小白,目前还在程序员发展的道路上,兢兢业业的小心求学. 有一天,小白接到一个任务,完成一个Winform程序,附加一个功能就是可以读IC卡. 小白终 ...

  10. oracle merge into 语法

    MERGE INTO upperLowerLimitData t1 USING (select name,enname,starttime,value ...   from dual) t2 ON ( ...