题面:#10471. 「2020-10-02 提高模拟赛」灌溉 (water)

假设只有一组询问,我们可以用二分求解:二分最大距离是多少,然后找到深度最大的结点,并且把它的\(k\)倍祖先的一整子树删掉,看一下一共要删几次,显然满足单调性。

现在要询问所有取值。上面二分的过程启发我们可以反过来,通过枚举答案,然后找到答案对应哪些询问。显然对于当前\(\text{ans}\),一次删除最少删掉\(ans+1\)个点,最多删\(\frac{n}{ans+1}\)次,因此是一个调和级数\(\frac{1}{1}+\frac{1}{2}+\frac{1}{3}+\frac{1}{4}+....+\frac{1}{n} -> n\ln(n)\),只要保证每次枚举的时间复杂度与\(n\)脱钩就行,用线段树维护剩余数的最大值的位置就行了,时间复杂度\(n\log^2(n)\)。

这个线段树的实现比较巧妙,\(\text{lazytag}\)有三种取值,\(0\)表示没有操作,\(1\)表示要把孩子们全删了,\(2\)表示要把孩子们全弄回来。若一个点的懒标记大于零,就直接用它的懒标记覆盖它儿子们的懒标记。为了实现恢复操作,要额外存下每个点最初始的值用作恢复用。


int tree[maxn * 4], val[maxn * 4], fir[maxn * 4]; /// val: 0 -> 无要求; 1 -> 要求填满; 2 -> 要求删掉 int pushup(int x, int y)
{
return dep[x] < dep[y] ? y : x;
} void spread(int x)
{
if (val[x] == 1)
{
val[x << 1] = val[x << 1 | 1] = 1;
tree[x << 1] = fir[x << 1];
tree[x << 1 | 1] = fir[x << 1 | 1];
}
if (val[x] == 2)
{
val[x << 1] = val[x << 1 | 1] = 2;
tree[x << 1] = tree[x << 1 | 1] = 0;
}
val[x] = 0;
} void build(int x, int l, int r)
{
val[x] = true;
if (l == r)
{
fir[x] = tree[x] = pnt[l];
return;
}
int mid = (l + r) >> 1;
build(x << 1, l, mid);
build(x << 1 | 1, mid + 1, r);
fir[x] = tree[x] = pushup(tree[x << 1], tree[x << 1 | 1]);
} void erase(int x, int l, int r, int ll, int rr)
{
//tree[x] *= val[x];
//tree[x] = fir[x] * val[x];
if (ll <= l && r <= rr)
{
tree[x] = 0; val[x] = 2;
return;
}
spread(x);
int mid = (l + r) >> 1;
if (ll <= mid)
{
erase(x << 1, l, mid, ll, rr);
}
if (rr > mid)
{
erase(x << 1 | 1, mid + 1, r, ll, rr);
}
tree[x] = pushup(tree[x << 1], tree[x << 1 | 1]);
} int calc(int k)
{
//insert(1, 1, 1, 1, n);
val[1] = 1;
tree[1] = fir[1];
int ret = 0;
while (tree[1])
{
int del = Kfat(tree[1], k);
erase(1, 1, n, dfn[del], dfn[del] + sze[del] - 1);
ret++;
}
return ret;
}

#10471. 「2020-10-02 提高模拟赛」灌溉 (water)的更多相关文章

  1. #10470. 「2020-10-02 提高模拟赛」流水线 (line)

    题面:#10470. 「2020-10-02 提高模拟赛」流水线 (line) 题目中的那么多区间的条件让人感觉极其难以维护,而且贪心的做法感觉大多都能 hack 掉,因此考虑寻找一些性质,然后再设计 ...

  2. 「2019-8-13提高模拟赛」树 (tree)

    传送门 Description 你有一个 \(n\)个点的树,第 \(i\)个点的父亲是\(p_i\).每个点有一个权值 \(t_i\) 和一个颜色黑或者白.所有点一开始都是白色. 你要进行 \(m\ ...

  3. 「2019-8-11提高模拟赛」女装盛宴 (flag)

    传送门 Solution  基环树+倍增+双指针 第一次因为#define int long long而玄学RE 为什么标程都不用开\(long long\)啊 Code  /*玄学RE 看来defi ...

  4. 「CSP-S模拟赛」2019第四场

    「CSP-S模拟赛」2019第四场 T1 「JOI 2014 Final」JOI 徽章 题目 考场思考(正解) T2 「JOI 2015 Final」分蛋糕 2 题目 考场思考(正解) T3 「CQO ...

  5. 10.17 NOIP模拟赛

    目录 2018.10.17 NOIP模拟赛 A 咒语curse B 神光light(二分 DP) C 迷宫maze(次短路) 考试代码 B 2018.10.17 NOIP模拟赛 时间:1h15min( ...

  6. 10.16 NOIP模拟赛

    目录 2018.10.16 NOIP模拟赛 A 购物shop B 期望exp(DP 期望 按位计算) C 魔法迷宫maze(状压 暴力) 考试代码 C 2018.10.16 NOIP模拟赛 时间:2h ...

  7. JZOJ 2020.10.7 提高B组反思

    JZOJ 2020.10.7 提高B组反思 T1 比较简单的一道题 跑\(k\)遍\(SPFA\) 然后全排列顺序枚举求解 TLE 60 双向存边数组没开两倍-- T2 搞出分母 分子不会求 \(n^ ...

  8. JZOJ 2020.10.6 提高B组反思

    JZOJ 2020.10.6 提高B组反思 T1 NYG的动态数点 最简单的一题 很容易想到\(O(n)\)的做法 枚举最小的那个数,即\(a_k\) 然后向左和向右扩展 然后可以直接从右端点+1继续 ...

  9. 10.30 NFLS-NOIP模拟赛 解题报告

    总结:今天去了NOIP模拟赛,其实是几道USACO的经典的题目,第一题和最后一题都有思路,第二题是我一开始写了个spfa,写了一半中途发现应该是矩阵乘法,然后没做完,然后就没有然后了!第二题的暴力都没 ...

随机推荐

  1. sqlmap--tamper使用技巧

    apostrophemask.py 适用数据库:ALL 作用:将引号替换为utf-8,用于过滤单引号 使用脚本前: tamper("1 AND '1'='1") 使用脚本后: 1A ...

  2. seata代码控制回滚和临时挂起分布式事物

    seata代码控制回滚和临时挂起分布式事物 一.说明 二.功能实现 1.手动回滚分布式事物 2.临时挂起分布式事物 三.完整代码 四 参考链接 一.说明 此处只是简单的记录一下,使用了 Seata后, ...

  3. CodeForces-1076E Vasya and a Tree

    CodeForces - 1076E Problem Description: Vasya has a tree consisting of n vertices with root in verte ...

  4. 【BZOJ-2199】奶牛议会

    链接: BZOJ-2199 题意: 给出 \(n(1\leq n\leq 1000)\) 个点,\(m(1\leq m\leq 4000)\) 个形如:"点 \(a\) 取 \(ca\) 或 ...

  5. EasyX安装教程

    Easyx是什么 就是一款可以在Windows里让你的C++程序里显示图片等的工具. 注意:EasyX不支持Linux.MacOS.不过还有Qt等可以选择. 安装VC/VS Easyx只支持Visua ...

  6. 二进制插入 牛客网 程序员面试金典 C++ Python java

    二进制插入 牛客网 程序员面试金典 题目描述 有两个32位整数n和m,请编写算法将m的二进制数位插入到n的二进制的第j到第i位,其中二进制的位数从低位数到高位且以0开始. 给定两个数int n和int ...

  7. cf17A Noldbach problem(额,,,素数,,,)

    题意: 判断从[2,N]中是否有超过[包括]K个数满足:等于一加两个相邻的素数. 思路: 枚举. 也可以:筛完素数,枚举素数,直到相邻素数和超过N.统计个数 代码: int n,k; int prim ...

  8. 近期业务大量突增微服务性能优化总结-3.针对 x86 云环境改进异步日志等待策略

    最近,业务增长的很迅猛,对于我们后台这块也是一个不小的挑战,这次遇到的核心业务接口的性能瓶颈,并不是单独的一个问题导致的,而是几个问题揉在一起:我们解决一个之后,发上线,之后发现还有另一个的性能瓶颈问 ...

  9. MongoDB 集群 config server 查询超时导致 mongos 集群写入失败

    环境 OS:CentOS 7.x DB:MongoDB 3.6.12 集群模式:mongod-shard1 *3 + mongod-shard2 *3 + mongod-conf-shard *3 + ...

  10. webpack 之 js语法检查eslint

    webpack 之 js语法检查eslint // 用来拼接绝对路径的方法 const {resolve} = require('path') const HtmlWebpackPlugin = re ...