[BZOJ]2759 一个动态树好题 LCT + 数学 + 好题[真]

GATK SNP过滤参数优化:从标准到个性化调整的实践指南 本文深入探讨了GATK SNP过滤参数的个性化调整策略,强调不应盲目套用官方标准参数。文章详细拆解了QD、FS、SOR等关键过滤参数的含义,并提供了通过数据分布分析、文献调研和迭代测试来确定适合自身数据(如动植物重测序)最佳阈值的实践方法,旨在帮助研究者在保留真实变异与剔除假阳性信号之间找到最优平衡。 阅读详情

2759: 一个动态树好题

Time Limit: 10 Sec Memory Limit: 128 MB
Submit: 820 Solved: 278
[Submit][Status][Discuss]
Description

有N个未知数x[1..n]和N个等式组成的同余方程组:
x[i]=k[i]*x[p[i]]+b[i] mod 10007
其中,k[i],b[i],x[i]∈[0,10007)∩Z
你要应付Q个事务,每个是两种情况之一:
一.询问当前x[a]的解
A a
无解输出-1
x[a]有多解输出-2
否则输出x[a]
二.修改一个等式
C a k[a] p[a] b[a]

Input

N
下面N行,每行三个整数k[i] p[i] b[i]
Q
下面Q行,每行一个事务,格式见题目描述

Output

对每个询问,输出一行一个整数。
对100%的数据,1≤N≤30000,0≤Q≤100000,时限2秒,其中询问事务约占总数的80%

Sample Input

5

2 2 1

2 3 2

2 4 3

2 5 4

2 3 5

5

A 1

A 2

C 5 3 1 1

A 4

A 5

Sample Output

4276

7141

4256

2126

HINT

Source

By 范浩强

[Submit][Status][Discuss]

HOME Back

题解

这道题是真的动态树好题… 突然想起某道绝世好题[假] —- 其实是绝世水题.
需要对LCT维护方式很清晰才能来捉此题… 一开始一直T后来才发现vis开的bool数组… 样例太水.

首先对于每个同余方程的x将对应的p作为fa. 这样由于有n个点, 每个点都有fa, 所以一定是基环外向树森林… 基环外向树我的浅显理解就是一棵树上有一个环. 一个点x记录fa之后, 方程就变成了:
x = k * fa + b (mod m)
我们考虑怎么求解同余方程. 显然当一个联通块里的环里的一个的方程解出来, 整个联通块都解出来了. 由于有修改操作这样的动态维护, 所以想到用数据结构. 由于是基环外向树, 所以又想到拆一条边变成树, 用LCT来维护树. 砍了一条边怎么办 ? 定义每个基环外向树有个根, 根与根的fa不连边, 记一个sp[root]表示根的特殊fa. 这样将sp[root] access之后, 就能得到n个同余方程, 并且每个方程的另一个未知数(p)存在于这n个同余方程之中, 这样必定有解, 就能够解出一个解, 如果就想解出sp[root]是多少的话, 那么说明LCT需要维护最深的那个点的解.
那么考虑怎么维护: 一个x和他的fa的方程分别为
x = f * k1 + b1
f = ff * k2 + b2
合并成一个fa之后即为 x = k1 * (ff * k2 + b2) + b1, 这是一个关于解出x的方程. 记splay里每个点子树合并的最终方程为sum[x].这样splay里就可以update了, 但是必须要求是x和他的f才能合并. 这里有一个神奇的技巧, 那就是从下往上update的时候, 先合并sum[ls]和sum[x] (先后顺序有影响),再合并sum[x] 和 sum[rs[x]], 这样的合并顺序就能保证每次合并合法, 并且保存的是解出最深的那个点的解.
这样access sp[root]后, n个互相关联的同余方程合并最后会长成这个样子.
x(sp[root]) = k * x + b;求个逆元即可求出.

修改分类讨论:;

如果要改的点是一个root,那么直接修改sp就行了,否则我们要看要修改点是否在环
上,若在环上需要删边后先将root指向sp的边加进去,然后看是否会出现新环,有就讲新
父亲作为sp,否则直接连虚边。

具体见代码.
Tips:
1. 任何对一个点的访问或操作, 都要先access并splay.
2.由于根保存了信息, 所以根是固定的, 不能makeroot.

#include<bits/stdc++.h>
#define mod 10007
#define Boc register char
#define Acce register int
using namespace std;
const int maxn = 4e4 + 5;
char ss[4];
int n, q, idx;
int fa[maxn], c[maxn][2], inv[maxn], sp[maxn], vis[maxn];
inline const int read()
{
    Acce x = 0, f = 1;
    Boc ch = getchar();
    while (ch < '0' || ch > '9') {if(ch == '-')f = -1;ch = getchar();}
    while (ch >= '0' && ch <= '9') x = (x << 3) + (x << 1) + ch - '0', ch = getchar();
    return f * x; 
}
struct node
{
    int k, b;
    node(){}
    node(int k, int b) : k(k), b(b) {}
    friend node operator + (const node &x, const node &y)
    {   return node(x.k * y.k % mod, (y.k * x.b % mod + y.b) % mod); }
}a[maxn], sum[maxn];
void dfs(int x)
{
    vis[x] = idx;
    if (vis[fa[x]] == idx)
    {
        sp[x] = fa[x];
        fa[x] = 0;
    }   else if (! vis[fa[x]])
            dfs(fa[x]);
}
inline void init()
{
    inv[1] = 1;
    for (int i = 2; i < mod; ++ i)
        inv[i] = (mod - mod / i) * inv[mod % i] % mod;
}
inline bool isroot(int x)
{   return (c[fa[x]][0] != x && c[fa[x]][1] != x) || ! fa[x];   }
inline void update(int x)
{
    sum[x] = a[x];
    if (c[x][0]) sum[x] = sum[c[x][0]] + a[x];
    if (c[x][1]) sum[x] = sum[x] + sum[c[x][1]];
}
inline void rotate(int x)
{
    int y = fa[x], z = fa[y];
    int l = (c[y][0] != x), r = l ^ 1;
    if (! isroot(y)) c[z][c[z][0] != y] = x;
    fa[x] = z, fa[y] = x, fa[c[x][r]] = y;
    c[y][l] = c[x][r], c[x][r] = y;
    update(y), update(x);
}
inline void splay(int x)
{
    for (int f; ! isroot(x); rotate(x))
        if (! isroot((f = fa[x])))
            rotate((c[fa[f]][0] == f ^ c[f][0] == x) ? x : f);  
}
inline void access(int x)
{
    for (int t = 0; x; x = fa[x])
        splay(x), c[x][1] = t, update(x), t = x;
}
inline void cut(int x)
{
    access(x), splay(x);
    c[x][0] = fa[c[x][0]] = 0;
    update(x);
}
inline int findroot(int x) 
{
    access(x), splay(x);
    while (c[x][0]) x = c[x][0];
    splay(x);
    return x;
}
inline bool incircle(int x, int y)
{
    access(sp[y]), splay(sp[y]);
    splay(x);
    return x == sp[y] || ! isroot(sp[y]);
}
int main()
{
    init();
    n = read();
    for (Acce i = 1; i <= n; ++ i)
        a[i].k = read(), fa[i] = read(), a[i].b = read();
    for (Acce i = 1; i <= n; ++ i)
        if(!vis[i])
            ++ idx, dfs(i);
    q = read();
    int x, k, p, b, t;
    for (Acce i = 1; i <= q; ++ i)
    {
        scanf("%s", ss);
        if (ss[0] == 'A')
        {
            scanf("%d", &x);
            access(x), splay(x);
            node t1 = sum[x];

            x = findroot(x);
            access(sp[x]), splay(sp[x]);
            node t2 = sum[sp[x]];

            if(t2.k == 1)
            (t2.b) ? puts("-1") : puts("-2");
            else
            {
                int ni = inv[(1 - t2.k + mod) % mod] * t2.b % mod;
                printf("%d\n", (t1.k * ni % mod + t1.b) % mod); 
            }
        }
        else
        {
            x = read(), k = read(), p = read(), b = read();
            access(x), splay(x);
            a[x] = node(k, b), update(x);

            t = findroot(x);
            if(t == x)
            {
                if (findroot(p) == t) sp[t] = p;
                else sp[t] = 0, fa[t] = p; //link
            } else
            {
                if (incircle(x, t))
                {
                    cut(x);
                    access(t), splay(t);
                    fa[t] = sp[t], sp[t] = 0; 
                    if (findroot(p) == x) sp[x] = p;
                    else fa[x] = p; 
                }   else
                {
                    cut(x);
                    if (findroot(p) == x) sp[x] = p;
                    else fa[x] = p; 
                }
            }
        }
    }
}
opencode : 无法将“opencode“项识别为 cmdlet、函数、脚本文件或可运行程序的名称 解决方案 opencode命令识别问题与openclawcodexgemini确保的路径在 PATH 中。这个知识对所有 npm 全局工具通用。 阅读详情

相关推荐

Isograph Reliability Workbench 14实战:从零构建故障树分析模型

本文以“马达不转”为例,手把手教你使用Isograph Reliability Workbench 14从零构建故障树分析模型。内容涵盖创建工程、定义顶事件、添加逻辑门与基础事件等核心步骤,并介绍了模型检查与定性定量分析,帮助你系统掌握这一强大的可靠性工程工具。

weixin_29309213的博客 360

bzoj2759: 一个动态树好题 LCT维护环套树森林,乘法逆元

bzoj2759: 一个动态树好题 Description 有N个未知数x[1…n]和N个等式组成的同余方程组: x[i]=k[i]*x[p[i]]+b[i] mod 10007 其中,k[i],b[i],x[i]∈[0,10007)∩Z 你要应付Q个事务,每个是两种情况之一: 一.询问当前x[a]的解 A a 无解输出-1 x[a]有多解输出-2 否则输出x[a] 二.修改一个等式 C a k[...

maxtir的博客 362

爬虫-Playwright逆向小红书

【代码】爬虫-Playwright逆向小红书。

weixin_44201223的博客 2430

BZOJ 2759 一个动态树好题(动态树)

题意 https://www.lydsy.com/JudgeOnline/problem.php?id=2759 思路 每个节点仅有一条有向出边, 这便是一棵基环内向树,我们可以把它在 \(\text{LCT}\) 内部当作有根树维护,外部再保存根的出边。 我们用一个结构体 \((K,B)​\) 表示 \(y=Kx+B​\) ,它的加法运算意义是将前者的 \(y​\) 代入后者的 \(x​\) 。...

weixin_30326745的博客 176

Yolov2 训练时anchor是如何使用的?build_target

0.简略描述 1.将真值检测框变换到特征图尺度上 2.计算以特征图每个网格中心为中心点时所有锚框与真值检测框的交并比 3.取与真值检测框交并比最大的锚框的id,及真值检测框中心所在cell的id,有此,可将真值检测框与预测结果对应起来 4.计算位置回归损失,置信度损失,分类损失 1,网络的输出 图1 yolov2 网络对于检测框位置大小的输出是: 对于1个batch网络的输出的shape为[batch_size, H*W*num_anchors, 5+num_classes], 其中: num_

机器人视觉感知 2817

海康威视摄像头CVE-2017-7921漏洞复现:从零到一的实战指南(含解密工具下载)

本文详细解析了海康威视摄像头CVE-2017-7921漏洞的技术原理与复现方法,提供从环境搭建到实战利用的完整指南。通过认证绕过漏洞,攻击者可获取敏感信息并执行高权限操作,文章还包含解密工具下载与防御建议,助力安全研究人员深入理解物联网设备安全风险。

weixin_29325515的博客 813

bzoj2759:一个动态树好题 (LCT+Exgcd)

题目传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=2759 题目分析:这是一道真动态树好题,不像某些其它自称好题的题目(bzoj4300“绝世好题”,其实是大水题)。 言归正传,我们来看看这道题。如果有一条方程是a=ka+b%10007的形式,且01时,用扩展欧几里得解。那么假设有两条方程:a1=k1a2+b1%10007,a2=k2a

KsCla 1297

LAMMPS实操系列(一): 大量FCC-CoCrCuFeNi高熵合金建模与最稳定结构筛选

高熵合金(High-entropy alloys,HEA),是由五种或五种以上等量或大约等量金属形成的合金。由于高熵合金可能具有许多优秀的物理化学性质,因此在材料科学领域受到广泛关注

Ceshigo_CD的博客 3257

BZOJ 2759: 一个动态树好题

LCT+数论

curry的博客 297

【我的Android进阶之旅】解决android应用使用android:persistent属性带来的系统Launcher应用必须重启设备才生效的问题,大幅度提升开发效率

一、问题描述 我们在开发系统级别应用,比如Launcher桌面的时候,会发现有个问题:每次Launcher修改完代码,重新编译之后,安装到android设备上之后,必须重启才会生效。否则就是使用了之前的Launcher版本的内容。而每次重启设备得一分钟左右,太慢了,太影响效率了! 1.1 痛点 每次更新完代码,重新安装之后,必须重启设备才会生效。效率太TM低了! 二、分析问题 经过一轮代码排查,最终发现是因为src\main\AndroidManifest.xml文件中,定义application使用了an

字节卷动 1713

基于深度学习YOLOv5的草莓成熟度检测系统详解(深度学习模型+UI界面+Python代码+训练数据集)

数据采集与预处理模块:负责收集草莓图像,并进行数据增强和标注。深度学习模型训练模块:使用YOLOv5模型进行草莓成熟度检测模型的训练。模型推理模块:加载训练好的模型,对输入图像或视频进行草莓成熟度检测。UI界面模块:提供用户交互界面,方便用户上传图像或视频进行成熟度检测。本文详细介绍了基于YOLOv5的草莓成熟度检测系统的构建过程,包括数据集的构建、模型的训练与推理、以及UI界面的设计。通过本文的指导,读者可以快速搭建一个高效的草莓成熟度检测系统,并应用于实际场景中。

斌擎科技 524

bzoj2759

感觉要去算题,而不是让题算我。还记得郑渊洁童话中,有一句话是要俯视知识,而不是在海洋里挣扎。 今天才注意到ppt里的一句话: 动态树!=lct,lct只是解决动态树问题的一种数据结构 ppt链接:http://wenku.baidu.com/view/a611cec4dd3383c4bb4cd2d8.html (在机房搜索一个悬疑小说的结局,结果出来一大堆奇怪的网页,关键...

190

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

[BZOJ2759][LCT][数学]一个动态树好题

BZOJ2759 把每个i和p[i]连边 实际上是要维护一个基环森林,一个环的方程就可以直接解 对于一条路径上的方程,根据方程的线性性,我们可以合并这条路径上的方程得到一个关于路径两个端点的方程 用LCT维护 环就拆一条边,在这条边的起点记录一个special信息,始终把这样的点设为根,然后求解就先用exgcd求出根节点的解然后用LCT求出需要求的点的解 修改都是单点修改,需要讨论下 先看是不是根...

romiqi 165

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

bzoj 2759一个动态树好题

真的是动态树好题,如果把每个点的父亲设成p[x],那么建出来图应该是一个环套树森林,拆掉一条边,就变成了动态树,考虑维护什么,对于LCT上每个节点,维护两组k和b,一组是他到他父亲的,一组是他LCT子树中深度最深的点到深度最浅的点的父亲的k和b,查询时只需查询一颗树中sf到自己的k和b,判断是否有唯一解,然后再解就可以了。注意不能换根,因为树的形态是固定的。 1 #incl...

aida9573的博客 235

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

BZOJ 2759 一个动态树好题(Link-Cut Tree+数学)

中文题就不解释题意了……         做一道LCT主要是想在赛前复习一下LCT,然后再次感叹LCT的神奇……         这题很多同余方程,某个方程的解依赖于其他方程的解,由此可以构成一个类似于树的数据结构,所以比较自然的想到LCT。然后根据式子的关系,显然这些方程是可以相互合并的(把一个方程代入另一个方程),如此更适合用数据结构了。但是,问题来了,这里面可能出现环,该如何处理呢。我们注意到,父亲可以由儿子表示,爷爷可以由父亲表示,那么当出现环的时候,我完全可以通过合并,使得假想根和它的父亲fa(它

alpc_qleonardo 734

[BZOJ2759]一个动态树好题

题面描述 传送门 思路 思考一下不难发现应该至少有一个环(没环貌似不能求解),也就是下面这样一个同余方程组 {x1≡k1∗x2+b1(mod⁡10007)x2≡k2∗x3+b2(mod⁡10007)x3≡k3∗x4+b3(mod⁡10007)⋯⋯xn≡kn∗x1+bn(mod⁡10007)\begin{cases}x_1\equiv k_1*x_2+b_1(\operatorname{mod} 1...

lb2003 308

bzoj 2759 一个动态树好题 LCT 数学

果然是一道动态树好题。 《论LCT的正确使用方法》以及《出题人真会玩》系列把每个点向p连一条边,那么这是一个基环树森林。 先从环上拆下来一条边并记录这条边指向的点,然后这玩意就变成了一坨有根树。 设根为x1,根指向的点为x2,那么所有点都可以用关于x2的一次函数表示。然后用x2本身的一次函数可以解出x2。 然后用LCT维护这坨有根树。 splay上每个点维护用这个点子树中最小(最靠左,原树

make_it_for_good的博客 605

bzoj2759 一个动态树好题 [lct+exgcd]

Description: 有NNN个未知数x[1..n]x[1..n]x[1..n]和NNN个等式组成的同余方程组: x[i]=k[i]∗x[p[i]]+b[i]x[i]=k[i]∗x[p[i]]+b[i]x[i]=k[i]*x[p[i]]+b[i] modmodmod 100071000710007 其中,k[i],b[i],x[i]∈[0,10007)∩Zk[i],b[i],x[i]∈[...

pocket_legend 303

BZOJ2759: 一个动态树好题

n<=30000个同余方程:$x_i\equiv k_i*x_{p_i}+b_i (mod 10007)$。m<=100000个操作:一、修改某个不等式的$k_i,p_i,b_i$,二、查询某个变量的值。无解-1,无穷解-2. 极其好玩的一道题。不像某些“绝世好题”实际是水题。。 首先按依赖关系可以建成基环树啦,因为n个点,每个点1条出边嘛。 错误!是基环森林。因为忽略...

weixin_30375247的博客 78

bzoj2759 一个动态树好题(数学+基环树lct)

我们先不考虑修改操作。如何求解一个n个方程的n元线性模方程组呢?我们可以用图论来做!把i的父亲设为pi,我们就得到了一个基环森林。对于每一个连通块,一定会有一个环,我们根据这个环就可以求解出一个方程的解,然后这整个连通块的解就都可以得到了。我们考虑如何动态维护这个东西,我们想到了lct。把每棵基环树的环拆掉一条边,我们就得到了一个森林。把拆掉的这条边的一端作为根,另一端记在根上,记作spfa[rt]

Icefox的博客 541

【刷题】BZOJ 2759 一个动态树好题

Description 有N个未知数x[1..n]和N个等式组成的同余方程组: x[i]=k[i]*x[p[i]]+b[i] mod 10007 其中,k[i],b[i],x[i]∈[0,10007)∩Z 你要应付Q个事务,每个是两种情况之一: 一.询问当前x[a]的解 A a 无解输出-1 x[a]有多解输出-2 否则输出x[a] 二.修改一个等式 C a k[a] p[a] b[a] Inpu...

weixin_30709635的博客 105

坑

太多了   【近期】一个个都是坑 [2017-03-14] 以前挖的:概率DP,单纯形法题目,点分治题目 [2017-03-13] topcoder 课件DP题 srm 561 div1 550 [2017-03-03 11:52:43] 感觉被坑了一节课.....好难啊看不懂题解不会做 https://www.codechef.com/problems/BTREE ...

weixin_34015566的博客 366

BZOJ 2759: 一个动态树好题 【LCT(节点维护线性方程)】

题目描述: 题目传送门 有N个未知数x[1…n]和N个等式组成的同余方程组: x[i]=k[i]∗x[p[i]]+b[i]mod10007x[i]=k[i]*x[p[i]]+b[i] mod 10007x[i]=k[i]∗x[p[i]]+b[i]mod10007 其中,k[i],b[i],x[i]∈[0,10007)∩Z 你要应付Q个事务,每个是两种情况之一: 一.询问当前x[a]的解:A a 无...

Master.Yi的博客 286

【BZOJ2759】一个动态树好题

Description有N个未知数x[1..n]和N个等式组成的同余方程组: x[i]=k[i]*x[p[i]]+b[i] mod 10007 其中,k[i],b[i],x[i]∈[0,10007)∩Z 你要应付Q个事务,每个是两种情况之一: 一.询问当前x[a]的解 A a 无解输出-1 x[a]有多解输出-2 否则输出x[a] 二.修改一个等式 C a k[a] p[a] b

CreationAugust is 14 years old forever 1833

【BZOJ2759】 一个动态树好题(LCT)

传送门 题解: 发现是个基环树森林。也就是仙人掌森林,俗称荒漠,直接上Link-Cut-Cactus就行了 发现有的方程会形成环,我们对于每个连通块,定一个根节点,然后根节点的父亲设置为Special_Father。这样每次可以把环提取出来,得到根节点的解。然后access一下得到当前点与根节点的关系就可以直接算了。 需要注意的修改的时候,对于修改的是否是环上的点需要大力分类讨论一下。 代码:...

zxyoi_dreamer的博客(不定期诈尸) 291

[LCT] BZOJ2759.一个动态树好题

把 pip_i 设为 ii 的父亲,这样会变成一个基环森林可以发现一个点有解当且仅当这个店所在联通块存在环对于环,可以任取一点作为根,根原本的父亲看做一条特殊的边。那么用LCT可以维护出一个点与这个点所在联通块的根的关系,也就是xi=k×xrt+bx_i=k\times x_{rt}+b,其中 kk , bb是用LCT维护出的值。那么可以根据根与根的父亲的关系求出根的值,然后就可以求出这棵基环树上任

CE玩家 487
上一篇: [BZOJ]1014 [JSOI]2008 火星人prefix Splay
下一篇: [BZOJ]3159 决战 LCT&Splay
MaxMercer
博客等级 码龄10年 55粉丝 261原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值