[BZOJ3159]决战(树链剖分+Splay)

AOI检测总误判?五大常见问题与实战解决方案 通过对图像质量、检测程序、外界干扰、算法优化以及设备维护和校准的全面把控,企业可以有效降低误判率,提升AOI检测的准确性和可靠性,为工业生产提供更有力的质量保障。表现描述:在AOI检测时,元器件字符因印刷颜色深浅、模糊或受到灰尘干扰等差异,再加上元件库参数未根据实际生产优化,会使系统误将合格元件判定为不合格,严重影响生产效益和产品质量。优化元件库:着重检测关键差异字符,如型号编码等关键信息,剔除不必要字符的检测项,减少干扰,专注于关键识别的准确性。检测时,根据物料信息动态更新检测参数,使系统适应物料变化。 阅读详情

=== ===

这里放传送门

=== ===

题解

树链增加一个值,树链求和求最大最小值?似乎要用链剖啊
但是这个翻转操作是什么鬼链剖不一般都是搭配线段树食用的么→_→
好吧强行套上平衡树
方法蠢到家了,就是把要翻转的那一条链一块块揪出来按顺序拼成一大棵Splay然后打上翻转标记再一块块塞会原来的地方。。
不过这个题目的一个方便之处就是翻转操作一定是到根的一条路径,所以它保证了区间的顺序,否则因为一交换x和y它顺序就不大一样了所以会更麻烦。。就要分上行下行路径之类的讨论一下了。。。
注意提取链的时候Find过程中要考虑前面已经删去的节点对序列中数字的编号的影响,因为删去以后相当于后面的元素整体前移了。
这个题要用long long。

代码

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#define inf 1000000000
using namespace std;
int n,m,rt,p[50010],a[100010],next[100010],tot,cnt,top[50010],fa[50010],w[50010],son[50010],size[50010],deep[50010];
struct record{
    int bgn,len;
    void ins(int L,int R){bgn=L;len=R-L+1;}
}rec[50010];
struct Node{
    Node *ch[2],*fa;
    int size,dlt;
    long long sum,data,Max,Min,;
    bool rev;
    Node();
    bool pl(){return this==fa->ch[1];}
    void count(){
        size=ch[0]->size+ch[1]->size+1;
        sum=ch[0]->sum+ch[1]->sum+data;
        Max=max(data,max(ch[1]->Max,ch[0]->Max));
        Min=min(data,min(ch[1]->Min,ch[0]->Min));
    }
    void Rever();
    void Add(long long v);
    void push();
}*null,*Root,*root;
Node::Node(){
    ch[1]=ch[0]=fa=null;
    size=sum=Max=rev=data=dlt=0;
    Min=inf;
}
void Node::Rever(){swap(ch[1],ch[0]);rev^=1;}
void Node::Add(long long v){sum+=v*size;data+=v;Max+=v;Min+=v;dlt+=v;}
void Node::push(){
    if (rev==true){
        if (ch[0]!=null) ch[0]->Rever();
        if (ch[1]!=null) ch[1]->Rever();
        rev=false;
    }
    if (dlt!=0){
        if (ch[0]!=null) ch[0]->Add(dlt);
        if (ch[1]!=null) ch[1]->Add(dlt);
        dlt=0;
    }
}
void Rotate(Node* &Rt,Node *k){//注意过程里会修改Rt,所以要传变参
    Node *r=k->fa;
    if (k==null||r==null) return;
    int x=k->pl()^1;
    r->push();k->push();
    r->ch[x^1]=k->ch[x];
    if (k->ch[x]!=null)
      r->ch[x^1]->fa=r;
    if (r->fa!=null)
      r->fa->ch[r->pl()]=k;
    else Rt=k;
    k->fa=r->fa;
    r->fa=k;
    k->ch[x]=r;
    r->count();k->count();
}
void Splay(Node* &Rt,Node *r,Node *tar){
    for (;r->fa!=tar;Rotate(Rt,r))
      if (r->fa->fa!=tar)
        Rotate(Rt,r->pl()==r->fa->pl()?r->fa:r);
}
void Find(Node* &Rt,int k,Node *tar){
    Node *r=Rt;
    r->push();
    while (k!=r->ch[0]->size+1){
        if (k<r->ch[0]->size+1) r=r->ch[0];
        else{
            k=k-r->ch[0]->size-1;
            r=r->ch[1];
        }
        r->push();
    }
    Splay(Rt,r,tar);
}
void add(int x,int y){
    tot++;a[tot]=y;next[tot]=p[x];p[x]=tot;
}
void dfs(int u){
    deep[u]=deep[fa[u]]+1;
    size[u]=1;son[u]=0;
    for (int i=p[u];i!=0;i=next[i])
      if (a[i]!=fa[u]){
          fa[a[i]]=u;
          dfs(a[i]);
          size[u]+=size[a[i]];
          if (size[a[i]]>size[son[u]])
            son[u]=a[i];
      }
}
void dfs_again(int u,int tp){
    top[u]=tp;w[u]=++cnt;
    if (son[u]!=0) dfs_again(son[u],tp);
    for (int i=p[u];i!=0;i=next[i])
      if (a[i]!=fa[u]&&a[i]!=son[u])
        dfs_again(a[i],a[i]);
}
Node* build(int l,int r){
    if (l>r) return null;
    Node *k=new Node();
    int mid=(l+r)>>1;
    k->size=1;
    k->ch[0]=build(l,mid-1);
    k->ch[1]=build(mid+1,r);
    if (k->ch[0]!=null) k->ch[0]->fa=k;
    if (k->ch[1]!=null) k->ch[1]->fa=k;
    k->count();
    return k;
}
void Addnum(int L,int R,int val){
    Find(Root,L,null);Find(Root,R+2,Root);
    Root->ch[1]->ch[0]->Add(val);
    Root->ch[1]->count();
    Root->count();
}
void Increase(int x,int y,int val){
    while (top[x]!=top[y]){
        if (deep[top[x]]<deep[top[y]]) swap(x,y);
        Addnum(w[top[x]],w[x],val);
        x=fa[top[x]];
    }
    if (deep[x]>deep[y]) swap(x,y);
    Addnum(w[x],w[y],val);
}
long long Get(long long &ans,int L,int R,int opt){
    Find(Root,L,null);Find(Root,R+2,Root);
    Node *k=Root->ch[1]->ch[0];
    if (opt==1) ans+=k->sum;
    if (opt==2) ans=max(ans,k->Max);
    if (opt==3) ans=min(ans,k->Min);
}
long long Getinfo(int x,int y,int opt){
    long long ans=(opt==3)?inf:0;
    while (top[x]!=top[y]){
        if (deep[top[x]]<deep[top[y]]) swap(x,y);
        Get(ans,w[top[x]],w[x],opt);
        x=fa[top[x]];
    }
    if (deep[x]>deep[y]) swap(x,y);
    Get(ans,w[x],w[y],opt);
    return ans;
}
void Reverse(int tot){
    Node *k;
    int newsz=0;
    for (int i=tot;i>=1;i--){
        int L,R;
        L=rec[i].bgn;R=rec[i].bgn+rec[i].len-1;
        L-=newsz,R-=newsz;//整体前移
        Find(Root,L,null);Find(Root,R+2,Root);
        k=Root->ch[1]->ch[0];
        Root->ch[1]->ch[0]=null;
        Root->ch[1]->count();Root->count();
        Find(root,newsz+1,null);Find(root,newsz+2,root);
        root->ch[1]->ch[0]=k;
        k->fa=root->ch[1];//更改节点的父亲不然Rotate的时候会出错
        root->ch[1]->count();root->count();
        newsz+=k->size;
    }
    root->Rever();
    for (int i=tot;i>=1;i--){
        int L=rec[i].bgn,R;
        Find(Root,L,null);Find(Root,L+1,Root);
        L=1;R=rec[i].len;//每次找出与当前长度相等的一段
        Find(root,L,null);Find(root,R+2,root);
        k=root->ch[1]->ch[0];
        root->ch[1]->ch[0]=null;
        root->ch[1]->count();root->count();
        Root->ch[1]->ch[0]=k;
        k->fa=Root->ch[1];
        Root->ch[1]->count();Root->count();
    }
}
void Invert(int x,int y){
    int cnt=0;
    while (top[x]!=top[y]){
        if (deep[top[x]]<deep[top[y]]) swap(x,y);
        rec[++cnt].ins(w[top[x]],w[x]);
        x=fa[top[x]];
    }
    if (deep[x]>deep[y]) swap(x,y);
    rec[++cnt].ins(w[x],w[y]);
    Reverse(cnt);
}
int main()
{
    null=new Node;*null=Node();
    scanf("%d%d%d",&n,&m,&rt);
    for (int i=1;i<n;i++){
        int x,y;scanf("%d%d",&x,&y);
        add(x,y);add(y,x);
    }
    dfs(rt);dfs_again(rt,rt);
    Root=build(0,n+1);
    root=build(0,1);
    for (int i=1;i<=m;i++){
        char opt[10];
        int x,y,val;
        scanf("%s",opt);
        scanf("%d%d",&x,&y);
        if (opt[0]=='I'&&opt[2]=='c'){
            scanf("%d",&val);Increase(x,y,val);
        }
        if (opt[0]=='S') printf("%I64d\n",Getinfo(x,y,1));
        if (opt[0]=='M'&&opt[1]=='a')
          printf("%d\n",Getinfo(x,y,2));
        if (opt[0]=='M'&&opt[1]=='i')
          printf("%d\n",Getinfo(x,y,3));
        if (opt[0]=='I'&&opt[2]=='v')
          Invert(x,y);
    }
    return 0;
}
Arduino IDE 开发ESP32-S3编译报错 Sketch too big?一步步解决! 解决方法很简单,只需要一步步来修改 Arduino IDE 的配置即可。确保你已经打开 Arduino IDE 并加载了你的 ESP32 代码。如果你也遇到了这个问题,按这个方法试试,应该就能顺利搞定!,如果你需要 OTA,就不能选这个方案,需要换成。,但我回头一想,我这块 ESP32-S3 可是。,按理说存储空间应该足够啊,那这到底是咋回事?,默认方案就装不下了,这时就需要选择更大的。按钮,这次应该不会报错了!,然后在下拉菜单中找到。,可以支持更大的固件。如果你的固件体积超过。,就能正常编译上传。 阅读详情

相关推荐

VSCode搭配Keil开发STM32:从环境配置到代码跳转全流程(避坑指南)

本文详细介绍了如何使用VSCode搭配Keil进行STM32开发,从环境配置到代码跳转的全流程指南。通过安装必备插件和正确配置项目文件,开发者可以在VSCode中享受现代编辑器的便捷功能,同时保留Keil的编译调试能力,提升嵌入式开发效率。

weixin_28832121的博客 253

bzoj3159: 决战

这道题真是让我对LCT有了新的认识啊! 题意大概就是实现一颗树,支持路径翻转!然后我一脸懵逼地想到了splay,然后不会。 其实只要一个LCT就可以了,额外开一颗splay记录prefer路径上的值,然后翻转就是MakeRoot+splay+reverLCt+reverSplay,然后就好了。。。 LCt真是神奇啊。。。 #include #include #define N 50005

miaom的博客 1214

从气象预报到物流规划:多尺度地理加权回归(MGWR)在ArcGIS Pro中的实战应用

本文深入探讨了多尺度地理加权回归(MGWR)在ArcGIS Pro中的实战应用。通过对比传统GWR模型,MGWR的核心优势在于能识别不同解释变量的独特空间作用尺度,有效解决空间异质性问题。文章结合气象预报误差修正与物流网点选址两个案例,详细讲解了从数据准备、参数设置、带宽优化到结果解读的全流程,为地理数据分析师处理复杂空间数据提供了强大工具。

egg99的博客 1032

BZOJ3159 决战

如果不考虑链翻转,剩余操作都可以用LCT轻松维护 考虑链翻转,我们之所以不能直接再LCT上链翻转,是因为LCT的splay中序遍历还担负着维护深度信息的任务,而我们可以让LCT的splay只维护深度信息,对LCT中的每一个splay T,我们再开一个splay T',同样是以深度有序,维护T中的点的权值,在access操作过程中同时把T'进行与T相同的操作 为了找到与T对应的T',我们在结构s

neither_nor 1730

Proteus 8.17安装部署全指南:避坑、汉化与STM32库配置

Proteus是一款广泛用于单片机仿真与电路设计的EDA工具,其核心价值在于支持嵌入式系统原型验证与教学实践。Proteus 8.17版本重构了许可证机制(LIC Engine)、依赖环境(VC++ 2019/NET 4.8)及路径加载逻辑,导致传统安装方法失效。掌握正确安装部署流程,是保障原理图绘制、VSM仿真(如51/STM32/ESP32)及外设波形观测(OLED、SPI、ADC)稳定运行的前提。本文聚焦Windows平台下零失败安装路径选择、权限配置、汉化实施与高频器件(如STM32F103)元件库

weixin_33377602的博客 402

LiteOS | 基于LiteOS的智慧农业案例实验分享

分享一个基于小熊派+LiteOS+华为云的案例实验(智慧农业)。 实验框图 相关模块简介 1、STM32L431RCT6 2、LiteOS LiteOS是华为开发的轻量级实时操作系统: LiteOS源码GitHub仓库链接: https://github.com/LiteOS/LiteOS 其源码一级目录结构如下: 其内核包括任务管理、内存管理、时间管理、通信机制、中断管理、队列管...

嵌入式大杂烩 5990

bzoj 3159: 决战 (树链剖分+splay)

题目描述传送门题解其实就是之前用线段树维护的东西改成用splay维护 比较麻烦的就是翻转操作,需要把翻转的位置提出来插入的另一个splay中,翻转后再插回去 具体的细节还是见代码吧。代码#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #define N 100003

clover_hxy的博客 644

数学建模--十大经典常用算法

数学建模十大算法:灰色预测,蒙特卡洛,遗传算法,模拟退火法,组合算法,神经网络,动态规划,聚类算法,类比法,概率算法,Floyd算法

qq_51533426的博客 5647

【BZOJ】3159决战-LCT

先贴代码,果断时间再补题解。可以套两颗LCT。 本蒟蒻一晚上就耗这了… #include&amp;amp;amp;amp;lt;cstdio&amp;amp;amp;amp;gt; #include&amp;amp;amp;amp;lt;algorithm&amp;amp;amp;amp;gt; #include&amp;amp;amp;amp;lt;cstring&amp;amp;amp;amp;gt; #include&amp;a

远行客 463

044、手持视频抖动严重?OpenCV 光流 + IMU 融合的电子防抖工程方案

本文探讨了基于OpenCV光流和IMU融合的手持视频电子防抖方案。作者从实际工程经验出发,分析了纯光流和纯IMU方案的局限性,指出时间戳对齐和坐标系标定是关键挑战。文章详细介绍了融合滤波器的实现方法,推荐互补滤波替代卡尔曼滤波,并提出了动态调整融合系数的策略。在光流算法优化方面,建议采用网格化FAST特征点和前后向误差检测。最后分享了运动补偿裁剪策略和多线程流水线设计,强调在嵌入式设备上使用NEON指令优化性能。该方案通过精确的时间同步和传感器融合,有效解决了手持拍摄中的高频抖动问题。

ai技术增长的博客 250

【ArcGIS微课1000例】0066:图像融合(全色+多光谱)操作案例教程

图像融合是指将不同类型传感器的影像进行融合,既能使图向具有较高的空间分辨率,又具有多光谱的特性。除了遥感软件如Erdas能进行图像融合,ArcGIS软件也可以进行图像融合等图像增强操作。

智慧空间实验室 3077

[BZOJ]3159 决战 LCT&Splay

3159: 决战 Time Limit: 10 Sec  Memory Limit: 512 MB Submit: 420  Solved: 183 [Submit][Status][Discuss] Description Input 第一行有三个整数N、M和R,分别表示树的节点数、指令和询问总数,以及X国的据点。 接下来N-1行,每行两个整数X和Y,表示Kat

Le Petit Prince 877

论deepseek软件底层原理

如处理医学文本时,将任务分配给擅长医学知识处理的专家,避免通用模块处理的低效性,极大提升计算效率与任务处理的针对性。教师模型复杂且强大,学生模型结构简单。协作处理:多模块协作时,建立数据流通与交互机制,各模块按顺序或并行处理数据,不断传递与更新中间结果,共同完成复杂任务。(一)输入处理与任务判断 输入预处理:接收输入数据,如用户文本提问,首先进行清洗,去除噪声数据、特殊字符等。任务分类:通过MoE架构“路由器”,依据输入数据特征,判断任务所属领域与类型,如文本分类、情感分析等,为后续处理模块选择提供依据。

欢乐打代码! 2738

BZOJ 3159 决战 (splay+树链剖分)

题意:给出一棵树,(1)路径加一个值;(2)路径上的节点的值反转(只是值反转,不是节点反转);(3)询问路径最大值 最小值 和。 解题思路: 题目简单,代码冗长 写这道题的时候还没有学LCT,所以我写了一种非常奇葩的方法,纯splay+树链剖分,代码冗长,但我觉得还挺好理解的。 首先我们可以先对整棵树进行树链剖分,分出轻重链之后就可以将一条链分解成若干条重链,用splay维护剖分出来的序列,

LZJ209的博客 814

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

BZOJ3159: 决战(FHQ Treap)

传送门: 解题思路: 算是补坑了,这题除了Invert以外就可以树剖线段树解决了。 考虑Invert操作,延续先前树链剖分的做法,考虑先前算法的瓶颈。 最暴力的方法是暴力交换权值,然而这种方法忽略了当前树链剖分序的一个性质,那就是很多部分的树链是连续的,而且仅有$O(\lg n)$个区间。 考虑只有一个区间的做法,就很显然是区间翻转(这个不会搞的话你是怎么做到这道题的),于是,由于区间个...

weixin_30871293的博客 95

SAP B1中文培訓教材_SDK

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

[一类维护形态树和值树的LCT]BZOJ 3159: 决战

SolutionSolution首先这道题可以用TreapTreap加树链剖分。 LCTLCT的话,要维护两片SplaySplay森林。 一片为形态树森林,就相当于最原来的LCTLCT。 一片为值树森林,维护相应节点的权值。 通过对两片森林的同时操作,可以保证每时每刻两片森林可以通过旋转形态相同。 在形态树森林的根节点维护一个值树的指针,指向相应位置的值树森林的根节点。其余节点的指针指向空

Vectorxj的博客 682

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

bzoj3159 决战 LCT

题目大意: 维护一个树,支持以下操作: 1、链+ 2、链求和 3、链求最大 4、链求最小 5、链翻转(此处的翻转是指把链上的值翻转,而树的形态不变)题目分析:(LCT) 如果只有前四个操作就可以用LCT或者树链剖分+线段树随便维护一下就行了。 有了第五个操作就不行了。所以我们用两个LCT,一个维护这棵树的形态,另一个维护树上所有的权值。 两个LCT的链的剖分是一样的,但是splay

Todobe 724

BZOJ 3159: 决战 解题报告

BZOJ 3159: 决战 1 sec 512MB 题意: 给你一颗\(n\)个点,初始点权为\(0\)的有跟树,要求支持 Increase x y w 将路径\(x\)到\(y\)所有点点权加上\(w\) Sum x y 询问路径\(x\)到\(y\)的点权和 Major x y 询问从路径\(x\)到\(y\)最大点权 Minor x y 询问最小点权 Invert x y 将路径上的点权翻...

weixin_30785593的博客 215

BZOJ3159决战——树链剖分+非旋转treap(平衡树动态维护dfs序)

题目描述 输入 第一行有三个整数N、M和R,分别表示树的节点数、指令和询问总数,以及X国的据点。 接下来N-1行,每行两个整数X和Y,表示Katharon国的一条道路。 接下来M行,每行描述一个指令或询问,格式见题目描述。 输出 对于每个询问操作,输出所求的值。 样例输入 5 8 1 1 2 2 3 3 4 4 5 Sum 2 4 Inc...

weixin_34293059的博客 243

bzoj3159 决战

题目描述: bz 咕了几个月的题解: 无脑$splay$+树剖。 论复制粘贴在考场上拉分的重要作用。 代码: #include<cstdio> #include<cstring> #include<algorithm> using namespace std; typedef long long ll; const int...

a6t2007的博客 218

BZOJ[3159]决战 LCT

传送门ber~ 只有前四个操作的话就是LCT裸题了 链翻转不也是LCT的基本操作吗…. 等等,翻转的是权值? 正常的翻转改的是各个点的深度,位置与权值的对应关系并没有改变 那么我们可以考虑维护两棵LCT,一棵维护形态,一棵维护位置 翻转其中一个就相当于改变了对应关系 说的不是很明白的啊….还是看看学姐的blog吧 代码如下: #include&lt;ctype.h&gt; #in...

谁能代表肯德基 553

UniApp跨端应用在线升级方案:从版本检测到安装引导的完整实现

在移动应用开发中,版本更新是保障应用生命力和用户体验的关键环节。其核心原理在于构建一套客户端与服务端协同的版本管理机制,通过接口进行版本比对与策略下发。这项技术的核心价值在于,它能让开发者主动掌控更新节奏,有效提升新版本覆盖率,从而快速修复线上问题并推广新功能。典型的应用场景包括紧急Bug修复、新功能发布以及兼容性维护。本文聚焦于UniApp框架,深入探讨如何实现一套包含版本检测、升级策略、进度显示和安装引导的完整在线升级方案,其中强制升级与可选升级的弹窗策略,以及Android平台的FileProvide

weixin_30613433的博客 411

BZOJ 3159决战

题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3159 题意:给出一棵树,(1)路径加一个值;(2)路径上的节点的值反转(只是值反转,不是节点反转);(3)询问路径最大值最小值和。 思路:两棵树,一个维护拓扑关系,一个维护权值。 const int N=111111; void upMin(i64 &amp;x,i64 y...

weixin_34331102的博客 233

[BZOJ3159]-决战-LCT+Splay

说在前面 昨天晚饭后和zyc在操场散步。 me说me今晚要A了决战那个水题,顺便再去写一两道数论水题 zyc表示me想多了,说me肯定会写一晚上决战 然而,前一天晚上只用了一个半小时就1A了首都的me,当然是一脸不服 然后?然后昨晚me果然没有切掉那道题… 一开始样例RE,静态查错找了一堆错出来 后来去看了别人的代码,又找了一些错误出来…然而还是没有过样例…直到昨晚离开机房仍然样例R

泉華子的OI足迹 649

[一类维护形态树和值树的LCT] BZOJ 3159 决战

直接上题解吧 有空去看看那篇集训队论文 #include #include #include #include #define dprintf(...) fprintf(stderr,__VA_ARGS__) using namespace std; typedef long long ll; inline char nc(){ static char buf[100

雯舞 941

【BZOJ】2759一个动态树好题-LCT

题解 真·动态树好题。 根据题目要求,我们以点i向其p[i]连边,必然会得到基环树林,每个解可以在所在环里得解。我们将每个环上的一条边连成虚边,该边所连接的就是LCT里的root和p[root](记为rt的spf(special_father))。 我们在update是可以维护每个点的k,b,不断向上累计系数,更新到rt. 在求当前a的值时候,我们可以先找到rt,把rt的spf acces...

远行客 325
上一篇: [BZOJ2674]Attack(整体二分+树状数组套线段树)
下一篇: [BZOJ2844]albus就是要第一个出场(线性基)
FromATP
博客等级 码龄10年 75粉丝 163原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值