首页 > 其他分享 >P3521 题解

P3521 题解

时间:2023-01-10 17:02:35浏览次数:37  
标签:tmp P3521 int 题解 复杂度 build include size

非线段树合并做法。复杂度多一只 log,但是好写。

跳过不重要的部分,直达核心 —— 如何在递归时计算两棵子树互相的贡献?

题解区清一色线段树合并从值域角度考虑。但是显然倍增也能做啊。

考虑倍增时把小的合并到大的上。对每个节点维护一棵平衡树,从下往上合并时,把小树合并进大树中的同时计算答案,然后直接让父亲继承大树。这里我的做法是直接传指针,直接把指向原大树的指针传上去当作该树的指针。这样就做完了,细节看代码。

考虑复杂度。一个节点被从一棵树复制到另一棵树时所在子树大小至少加倍。因此一个节点至多被复制 \(\log n\) 次,单次复杂度 \(O(\log n)\),因此复杂度 \(O(n \log^2 n)\)。

注意到你需要在合并时求出某个平衡树有多少数小于给定数。这个用 set 不行,要上 pbds

代码不到 1k,大部分是 pb_ds

#include <cstdio>
#include <set>
#include <algorithm>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#define LL long long
using namespace std;
using namespace __gnu_pbds;
const int M = 5e5 + 5;
tree<int, null_type, less<int>, rb_tree_tag, tree_order_statistics_node_update> s[M];
int cnt;
LL ans;
int build() {
    int x; scanf("%d", &x);
    int rt = ++cnt;
    if(x != 0) return s[rt].insert(x), rt;
    else {
        int l = build(), r = build();
        if(s[l].size() < s[r].size()) swap(l, r);
        LL tmp = 0, tot = 1ll * s[l].size() * s[r].size();
        for(auto u : s[r]) {
            if(s[l].lower_bound(u) == s[l].end()) tmp += s[l].size();
            else tmp += 1ll * s[l].order_of_key(*s[l].lower_bound(u));
        }
        for(auto u : s[r]) s[l].insert(u);
        ans += min(tmp, tot - tmp);
        return l;
    }
}
int main() {
    int n; scanf("%d", &n); build();
    printf("%lld\n", ans);
}

标签:tmp,P3521,int,题解,复杂度,build,include,size
From: https://www.cnblogs.com/purplevine/p/17040758.html

相关文章

  • [IOI2000]邮局 题解
    简要题意线段上有\(V\)个村庄,现在要建\(P\)个邮局,使每个村庄到最近的邮局的距离之和最小。50分做法设\(dp[i][j]\)表示第一个村庄到第\(i\)个村庄,建了\(j\)个......
  • mysql delete大量数据表锁死,kill的线程后线程处于killed状态问题解决
    一、事件起因删除一张500G的表,没有添加任何约束条件,结果好久都没反应,查询锁之后,使用kill杀掉了进程,再次查询的时候,锁还在,trx_state的状态是ROLLINGBACK,使用showprocessl......
  • 网络流二十四题解题报告
    网络流二十四题解题报告\(\text{ByDaiRuiChen007}\)来源:LOJ-网络流24题机器人路径规划问题数据有误,不计入解题报告中1.飞行员配对方案问题ProblemLink构造二......
  • hidapi 编译成 dll 时出现无法解析外部符号问题解决方法
    问题现象:  解决方法: ......
  • Codeforces 1704 F Colouring Game 题解 (结论,SG函数)
    题目链接首先看R和B的数量不等的情况(很多博弈题都是先比较两种物品的数量,相等的情况再用SG函数之类的技巧),结论是R多Alice必赢,B多Bob必赢。证明:来看R比B多的情况,定义两人......
  • 2023-2-训练赛5 题解
    Buctoj训练赛5题解(C++)A、统计单词数该题目考查对string字符串的灵活运用初步观察题目,可将解题步骤分为大致四个模块输入两行字符串由于题目要求不区分大小写,故将......
  • Namomo Winter Camp D3 Div2 简易题解
    题目提交链接ProblemK.KotlinIsland首先不用考虑描边(那样和不画这条边是一样的)。那么剩下的就是在长度和宽度内枚举了。显然可以知道长宽最多画\((n-1)/2\)和......
  • 十二省联考 2019 题解
    Day1B字符串问题朴素的想法是,建一张\(n_a+n_b\)个点的有向图\(G\)。对于一个支配关系\((x,y)\),从\(x\)向\(y+n_a\)连边。此外,枚举\(1\lei\len_b\),对于每个......
  • 1.9寒假集训-进阶训练赛(五)A-M题解
    前五题网上都有不写了需要注意的是第四题是给定密钥和密文要把它加密算是一个逆过程看了半天都没读懂样例 第六题应该也有但是我写一下因为学校oj这边空间给的是1......
  • HDU-3949 XOR 题解报告
    题目地址题意:从一个序列中取任意个元素进行异或,求能异或出的所有数字中的第k小。分析:性质:一个线性基异或上另一个不同的线性基,并作为自己的新值,这并不改变整个线性......