首页 > 其他分享 >P5138 题解

P5138 题解

时间:2023-12-31 21:44:40浏览次数:32  
标签:return P5138 val int 题解 calcfib build func

因为本题的代码难度远大于解法的思考,因此这里提供一种好写的写法。

做法不再赘述,就是转化为 \(depth\) 差以后上线段树分别维护两个信息以后求和。题解中大多数使用同一个线段树维护两个信息,可读性并不高,且比较难写。

事实上我们注意到两棵线段树仅有初始的信息不一样,剩下需要支持的操作完全一样,这启发我们通过一些方式让我们方便的写两棵线段树。

这里介绍一种广为人知的黑科技:在结构体中使用函数指针。具体的,本人使用的部分代码如下:

int (*func)(int);
void build(int p, int l, int r) {
    // printf("%d %d %d\n", p, l, r);
    if (l == r) {
        val[p] = func(l) % mod;
        return;
    }
    build(ls, l, mid), build(rs, mid + 1, r);
    val[p] = val[ls] + val[rs];
    val[p] %= mod;
}

那么,我们初始化两棵线段树,需要对 \(func\) 赋值:

st1.func = [](int x) { return calcfib(depth[rev[x]]); };
st2.func = [](int x) { return calcfib(depth[rev[x]] - 1); };
st1.build(1, 1, n), st2.build(1, 1, n);

接着,我们重写两个函数以方便查询:

void update(int x, int y, int k) {
    st1.update(1, 1, n, x, y, calcfib(k + 1));
    st2.update(1, 1, n, x, y, calcfib(k));
}
int query(int x, int y) {
    return (st1.query(1, 1, n, x, y) + st2.query(1, 1, n, x, y)) % mod;
}

这样的代码个人认为要更优雅,可读性更好一些,避免了一堆结构体或 pair 的不便。
放上最后的代码

标签:return,P5138,val,int,题解,calcfib,build,func
From: https://www.cnblogs.com/Piggy424008/p/17938048/p5138-ti-jie

相关文章

  • P4434 题解
    远古模拟赛里的一道题,前来写篇题解记录一下。我们考虑一个显然的转化。将每条边染色,那么原问题等价于求下面的染色的方案数:对于每个点对\(a,b\),我们记\(\operatorname{lca}(a,b)=c\)有\(a\simc\)上的所有边同色。\(b\simc\)上的所有边同色。\(a\simc\)和\(b\simc......
  • CF958E1 题解
    Meaning在二维平面内,有位置不同且不存在三点共线的\(R\)个红点和\(B\)个黑点,判断是否能用一些互不相交的线段连接每一个点,使得每条线段的两端都分别是黑点和白点。Solution当\(R\ne{B}\)时,显然无法实现红点与黑点的两两组合,故题干所述的情况一定不存在。当\(R=B\)时,我......
  • P5765 [CQOI2005] 珠宝 题解
    P5765[CQOI2005]珠宝题解思路好题,注意到有性质:颜色数最多为\(\lfloor\log_2n\rfloor+1\),有了这个性质之后直接树形DP糊上去就过了。简要的证明:考虑一个点,显然一种颜色即可。对于一个颜色为\(c\)的点,其儿子至少有\(c-1\)个,且为\(1\simc-1\)的排列,这样可......
  • P2898 [USACO08JAN] Haybale Guessing G 题解
    题目传送门前置知识二分答案|并查集解法对条件的合法性判断其他题解已经讲得很明白了,这里不再赘述。这里主要讲一下用并查集实现黑白染色问题。以下内容称被覆盖为黑色,不被覆盖为白色。本题因为是单向染色,即从白到黑,故可类似luoguP1840ColortheAxis和D的并查集或......
  • 二叉树面试题解析
    二叉树面试题解析判断相同的树/***Definitionforabinarytreenode.*publicclassTreeNode{*intval;*TreeNodeleft;*TreeNoderight;*TreeNode(){}*TreeNode(intval){this.val=val;}*TreeNode(intval,TreeNode......
  • 剑指Offer Java题解(前3道题)
    目录1.二维数组中的查找2. 替换空格3. 从尾到头打印链表1.二维数组中的查找题目链接:传送。方法一,暴力枚举。参考代码:packageproblem01;/***@Authorsyrdbt*@Date2019/7/314:05*二维数组中的查找*方法一,暴力枚举*/publicclassSolution{publicboole......
  • 杭州电子科技大学2023新生赛 E 树 题解
    Question杭州电子科技大学2023新生赛E树给定一颗包含\(n\)个节点的带边权的树,定义\(xordist(u,v)\)为节点\(u\)到\(v\)的简单路径上所有边权值的异或和有\(q\)次询问,每次给出lrx求\(\sum_{i=l}^rxordist(i,x)\)的值Solution考试的时候脑子坏了对于一条......
  • 【省选联考2020】树 题解
    省选题解第一发~【省选联考2020】树我和这道题还挺有缘分的。有一次看大佬的省选游记(不知道是哪一年),然后提到有一道是01trie整体加一,当时我就印象深刻,然后在oiwiki上看了一下,心想这整体加一也只能从低位到高位维护01trie啊,又不能查询最大值,有什么卵用(划掉)。这是两周前的事......
  • 题解 [SDOI2016] 游戏
    可以看出来出题人很想出一道把李超和别的什么东西凑起来的题目,于是给了这么一个缝合怪。https://www.luogu.com.cn/problem/P4069符号有点混乱。比如箭头又可以表示路径又可以表示赋值,代入语境应该还是好理解的。看到\(a\timesdis+b\)就应激反应出来是李超了,看到\(s\to......
  • CF1884D Counting Rhyme 题解
    Problem-D-CodeforcesCountingRhyme-洛谷法1:我们之前肯定看过这样一道非常经典的题:求\(a_i\)中有多少对\((i,j)\),满足\(\gcd(a_i,a_j)=1\)\(n\leq10^6\)这题是莫反板子题,但显然可以不用莫反做。先不说这题怎么做,我们发现这道题和CF1884D的不同之处在......