【Qtree】Query on a tree系列LCT解法

LPDDR5时序精调:深入解析Read Gate Training的两种模式 本文深入解析了LPDDR5内存中关键的Read Gate Training技术,详细对比了RDQS Toggle Mode(翻转模式)与Enhanced RDQS Mode(增强模式)的工作原理、时序参数及适用场景。文章阐述了在高速数据传输下精准校准时序的必要性,并提供了两种模式的实战选型指南与系统级调试思路,帮助工程师优化内存性能与稳定性。 阅读详情

Qtree1-7

Qtree1 裸的树链剖分,当然也可以用LCT写,就不说什么了...

Qtree2 倍增lca,当然也可以用LCT写,就不说什么了...

Qtree3 裸的树链剖分,当然也可以用LCT写,就不说什么了...

接下来的Qtree4-7才是重点

推荐顺序(7->6->4->5),因为写了7就可以改一改贴到6,写了4就可以改一改贴到5了,瞬间少写两题

Qtree4 我已经想到了一个很好的LCT写法,只可惜这里空白太小,写不下了

Qtree5更简单一些,推荐先写5,或者写这题的不带边权版bzoj1095


—————————————————————————分割线——————————————————————————————


这题的做法很多,有动态树分治,树分治和其他的算法

我的写法是受到Qtree7的启发,听说Qtree7LCT的做法可以扩展到这题,于是就写了一发


这题用到的是Qtree7的两个思想之一,就是用一个数据结构维护虚边连接的子树的信息。

这题是用set维护。


首先把边权附到儿子结点上,记为len(len会引发很多细节问题,一定要小心)

实边上的信息就维护一个lmax,rmax,maxs,sum,类似线段树维护最长连续0/1串的长度

虚边就类似点分治时的想法,记录只到x点的链,和x子树中已经构成路径的两个白点(只管虚子树)


但是定义有一些区别

lmax这个子splay表示的一段重链最浅的白点出发的最长链长,rmax从该实链最深的白点出发的最长链长,maxs即答案,包括实边虚边的最远两白点距离 ,sum表示该子splay段实链总长

为了叙述方便,其他的一些定义:ls左儿子,rs有儿子


先讨论虚子树对maxs的影响,实边要复杂一些

最长和次长到x的链可以合并成一条路径

子树里已经形成的最大路径也可以更新

如果x是白点,那么最长链就可以更新了


虚子树信息的维护主要是在access中的虚实切换

对于要从实变虚的原右儿子,maxs[rs]扔进路径的set里,lmax[rs]扔进链的set里,因为要到x点,所以是lmax

同样,从虚变实的新右儿子,把maxs[y]从set里删去,把lmax[y]从set里删去

虚部就完成了



对于实链我们可以发现一个性质,LCT中splay的任意一个子树,对应的都是原树中实链连续的一段

我们在线段树的update合并左右区间时不可能向左向右暴力找到最远的1,更新答案

同样,我们也不能在splay里找到原树中紧邻x上面的点,把它splay上来更新答案

但一个合法的路径要穿过x点,就要过紧邻x上面的点,和紧邻x下面的点

所以我们要记lmax,rmax


然后就是写到吐血激动人心的update了

先更新lmax和rmax

lmax要过整棵子splay的最浅点

那么有lmax[x]=max(lmax[ls]//不过x

,max(虚链中最长+整个左儿子代表的一段,lmax[rs]+整个左儿子代表的一段))


rmax同理,注意x对应的这条边,会有一些细节问题


于是maxs就又有了两种新的更新方式

maxs[x]=max(maxs[x],rmax[rs]+max(虚链,lmax[rs]))

maxs[x]=max(maxs[x],lmax[rs]+max(虚链,rmax[ls]))

然后更新方式就完了

然后就没有然后了


O(nlog^2)卡常警报

不过当set的size比较大时,说明虚边很多,树的深度不深,LCT的操作次数要少一些

如果树的深度深,那么set的size又比较小,所以两个log并不严格

#include<bits/stdc++>
const int maxn=200010,maxm=200010,inf=1e9;
using namespace std;
int n,Q,pre[maxm],now[maxn],son[maxm],val[maxm],tot,ans=-inf,col[maxn];char op[5];//0白1黑
void add(int a,int b,int c){pre[++tot]=now[a],now[a]=tot,son[tot]=b,val[tot]=c;}
inline int fir(multiset<int> &s){return s.size()?*s.rbegin():-inf;}//最大,因为c++是左闭右开,所以s.end()不是最后一个,要--s.end()才是
inline int sec(multiset<int> &s){return s.size()>1?*(++s.rbegin()):-inf;}

struct Tlct{
	#define ls ch[x][0]
	#define rs ch[x][1]
	int ch[maxn][2],fa[maxn],lmax[maxn],rmax[maxn],maxs[maxn],sum[maxn],len[maxn],w[maxn];
	//lmax这个子splay表示的一段重链最浅的点出发的最长链长,rmax从该实链最深的点出发的最长链长,maxs即答案,最远两白点距离 
	//len当前点和父亲之间的边长度,sum该段实链总长 w表示颜色 白色为0表示有一个白点,距离可以是0,黑色为-inf,表示无白点
	multiset<int> chain[maxn],path[maxn];//chain 链 path 路径 用来存虚边信息
	inline int which(int x){return ch[fa[x]][1]==x;}
	inline bool isroot(int x){return ch[fa[x]][0]!=x&&ch[fa[x]][1]!=x;}
	void init(){for (int i=0;i<=n;i++) lmax[i]=rmax[i]=maxs[i]=-inf;}
	void update(int x){
		assert(x);
		sum[x]=sum[ls]+sum[rs]+len[x];
		int cha=max(w[x],fir(chain[x]));
		int L=max(cha,rmax[ls]+len[x]);//从左子树(实链中更浅的点)或虚边的白点来的最远链长
		int R=max(cha,lmax[rs]);//同理
		lmax[x]=max(lmax[ls],sum[ls]+len[x]+R);//要想清楚加不加len[x]
		rmax[x]=max(rmax[rs],sum[rs]+L);
		
		maxs[x]=max(rmax[ls]+len[x]+R,lmax[rs]+L);
		maxs[x]=max(maxs[x],max(maxs[ls],maxs[rs]));
		maxs[x]=max(maxs[x],fir(path[x]));
		maxs[x]=max(maxs[x],fir(chain[x])+sec(chain[x]));
		if (w[x]==0) maxs[x]=max(max(maxs[x],fir(chain[x])),0);//如果这是白点,就可以用子树中的链更新
	}
	void rotate(int x){
		assert(x);
		int y=fa[x],z=fa[y],nx=which(x),ny=which(y);
		fa[ch[x][!nx]]=y,ch[y][nx]=ch[x][!nx];
		fa[x]=z;if (!isroot(y)) ch[z][ny]=x;
		fa[y]=x,ch[x][!nx]=y;update(y);
	}
	void splay(int x){
		for (;!isroot(x);){
			int y=fa[x];
			if (isroot(y)) rotate(x);
			else if (which(x)==which(y)) rotate(y),rotate(x);
			else rotate(x),rotate(x);
		}update(x);
	}
	void access(int x){
		for (int y=0;x;y=x,x=fa[x]){
			splay(x);
			if (rs) path[x].insert(maxs[rs]),chain[x].insert(lmax[rs]);
			if (y) path[x].erase(path[x].find(maxs[y])),chain[x].erase(chain[x].find(lmax[y]));
			rs=y,update(x);
		}
	}
	void modify(int x){
		access(x),splay(x);
		col[x]^=1,w[x]=!col[x]?0:-inf;
		update(x),ans=maxs[x];
		//for (int i=1;i<=3;i++) print(i);
	}
	void print(int x){printf("x%d fa%d ls%d rs%d lmax%d rmax%d maxs%d sum%d len%d\n",x,fa[x],ls,rs,lmax[x],rmax[x],maxs[x],sum[x],len[x]);}
}T;

void dfs(int x){
	for (int y=now[x];y;y=pre[y]) if (son[y]!=T.fa[x]){
		T.fa[son[y]]=x,T.len[son[y]]=val[y],dfs(son[y]);
		T.chain[x].insert(T.lmax[son[y]]),T.path[x].insert(T.maxs[son[y]]);
	}T.update(x);
}

int main(){
	scanf("%d",&n),T.init();
	for (int i=1,x,y,z;i<n;i++) scanf("%d%d%d",&x,&y,&z),add(x,y,z),add(y,x,z);
	dfs(1),ans=T.maxs[1],scanf("%d",&Q);
	for (int i=1,x;i<=Q;i++){
		scanf("%s",op+1);
		if (op[1]=='A'){
			if (ans<0) puts("They have disappeared.");
			else printf("%d\n",ans);
		}
		else scanf("%d",&x),T.modify(x);
	}
	return 0;
}

/*
6
1 2 1
1 3 1
3 4 2
3 5 2
3 6 2
7
A
C 4
C 5
C 6
A
*/


Qtree5

qtree4的弱化版,注意初始都是是黑点,求的是最近


Qtree6 

很显然,树链剖分是可捉此题的

开两棵树,一棵白,一棵黑,记siz[x][0/1]表示子树中还有多少与之连通的同色点

再维护dfs序最小的连通的同色点(线段树里就记最左边的1的位置)

修改颜色时,把x到该点的路径上,重链就区间减,轻链就暴力减


——————————————————————————LCT写法————————————————————————————


也是记两棵树,一棵黑一颗白,对于虚边的siz直接用上面的方法,新开一个siz数组维护一下就好了

但是还有一个问题没有解决,如果改色时暴力link-cut,显然菊花图时修改的边数可以达到O(n)级别


于是就有了一个巧妙的写法,当一个点从白变黑时,只在白树里cut掉它和父亲的边,只在黑树里link上它和父亲的边

也就是保证黑白树中的每条边的儿子一定是黑/白色的,父亲则可能是其他颜色

询问时找到最浅的点,白点就在白树里询问,黑点就在黑树里询问,但要注意根要特判


#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
const int maxn=100010,maxm=200010;
using namespace std;
int n,Q,pre[maxm],now[maxn],son[maxm],tot,f[maxn],col[maxn];char ch;
void add(int a,int b){pre[++tot]=now[a],now[a]=tot,son[tot]=b;}
void read(int &x){
    for (ch=getchar();!isdigit(ch)&&ch!='-';ch=getchar());
    int t;if (ch=='-') t=-1,ch=getchar();else t=1;
    for (x=0;isdigit(ch);ch=getchar()) x=x*10+ch-'0';
    x=x*t;
}

struct Tlct{
	#define ls ch[x][0]
	#define rs ch[x][1]
	int fa[maxn],ch[maxn][2],siz[maxn],s[maxn];
	inline int which(int x){return ch[fa[x]][1]==x;}
	inline bool isroot(int x){return ch[fa[x]][0]!=x&&ch[fa[x]][1]!=x;}
	void update(int x){siz[x]=siz[ls]+siz[rs]+s[x]+1;}
	void rotate(int x){
		int y=fa[x],z=fa[y],nx=which(x),ny=which(y);
		fa[ch[x][!nx]]=y,ch[y][nx]=ch[x][!nx];
		fa[x]=z;if (!isroot(y)) ch[z][ny]=x;
		fa[y]=x,ch[x][!nx]=y;update(y);
	}
	void splay(int x){
		for (;!isroot(x);){
			int y=fa[x];
			if (isroot(y)) rotate(x);
			else if (which(x)==which(y)) rotate(y),rotate(x);
			else rotate(x),rotate(x);
		}update(x);
	}
	void access(int x){
		for (int y=0;x;y=x,x=fa[x]){
			splay(x);
			if (rs) s[x]+=siz[rs];
			if (y) s[x]-=siz[y];
			rs=y,update(x);
		}
	}
	void link(int x){
		access(f[x]),splay(f[x]),splay(x);
		ch[f[x]][1]=x,fa[x]=f[x],update(f[x]);
	}
	void cut(int x){access(x),splay(x),fa[ls]=0,ls=0,update(x);}
	int getroot(int x){
		access(x),splay(x);
		while (ls) x=ls;
		return x;
	}
	int query(int x){
		int c=col[x];x=getroot(x),splay(x);
		return col[x]==c?siz[x]:siz[rs];
	}
}T[2];

void dfs(int x){
	for (int y=now[x];y;y=pre[y]) if (son[y]!=f[x]){
		f[son[y]]=T[col[son[y]]].fa[son[y]]=x;
		dfs(son[y]),T[col[son[y]]].s[x]+=T[col[son[y]]].siz[son[y]];
	}
	T[0].update(x),T[1].update(x);
}

int main(){
	scanf("%d",&n);
	for (int i=1,x,y;i<n;i++) read(x),read(y),add(x,y),add(y,x);
	dfs(1),read(Q);
	for (int i=1,op,x;i<=Q;i++){
		read(op),read(x);
		if (!op) printf("%d\n",T[col[x]].query(x));
		else{
			if (f[x]) T[col[x]].cut(x),T[col[x]^1].link(x);
			col[x]^=1;
		}
	}
	return 0;
}


Qtree7


和Qtree6类似,维护虚边信息用set,因为维护最大值不能像维护siz一样直接加和减,所以要开一个set,细节稍微多一点

#include<set>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
const int maxn=100010,maxm=200010;
using namespace std;
int n,Q,pre[maxm],now[maxn],son[maxm],tot,col[maxn],f[maxn];char ch;
void add(int a,int b){pre[++tot]=now[a],now[a]=tot,son[tot]=b;}
void read(int &x){
    for (ch=getchar();!isdigit(ch)&&ch!='-';ch=getchar());
    int t;if (ch=='-') t=-1,ch=getchar();else t=1;
    for (x=0;isdigit(ch);ch=getchar()) x=x*10+ch-'0';
    x=x*t;
}
 
struct Tlct{
    #define ls ch[x][0]
    #define rs ch[x][1]
    int ch[maxn][2],fa[maxn],maxs[maxn],val[maxn];multiset<int> s[maxn];
    inline bool isroot(int x){return (ch[fa[x]][0]!=x&&ch[fa[x]][1]!=x);}
    inline bool which(int x){return ch[fa[x]][1]==x;}
    inline void update(int x){
        maxs[x]=val[x];
        if (s[x].size()) maxs[x]=max(maxs[x],*s[x].rbegin());
        if (ls) maxs[x]=max(maxs[x],maxs[ls]);
        if (rs) maxs[x]=max(maxs[x],maxs[rs]);
    }
    void rotate(int x){
        int y=fa[x],z=fa[y],nx=which(x),ny=which(y);
        fa[ch[x][!nx]]=y,ch[y][nx]=ch[x][!nx];
        fa[x]=z;if (!isroot(y)) ch[z][ny]=x;
        fa[y]=x,ch[x][!nx]=y;update(y);
    }
    void splay(int x){
        for (;!isroot(x);){
            int y=fa[x];
            if (isroot(y)) rotate(x);
            else if (which(x)==which(y)) rotate(y),rotate(x);
            else rotate(x),rotate(x);
        }
        update(x);
    }
    void access(int x){
        for (int y=0;x;y=x,x=fa[x]){
            splay(x);
            if (rs) s[x].insert(maxs[rs]);
            rs=y;
            if (y) s[x].erase(s[x].find(maxs[y]));
            update(x);
        }
    }
    int getroot(int x){
        access(x),splay(x);
        while (ls) x=ls;
        return x;
    }
    void link(int x){
        access(f[x]),splay(f[x]),splay(x);
        ch[f[x]][1]=x,fa[x]=f[x],update(f[x]);
    }
    void cut(int x){access(x),splay(x),fa[ls]=0,ls=0,update(x);}
	void modify(int x,int v){access(x),splay(x),val[x]=v,update(x);}
    int query(int x){
		int c=col[x];x=getroot(x),splay(x);
		return c==col[x]?maxs[x]:maxs[rs];
	}
}T[2];

void dfs(int x){
    for (int y=now[x];y;y=pre[y]) if (son[y]!=f[x]){
        f[son[y]]=T[col[son[y]]].fa[son[y]]=x;
        dfs(son[y]),T[col[son[y]]].s[x].insert(T[col[son[y]]].maxs[son[y]]);
    }
    T[0].update(x),T[1].update(x);
}

int main(){
    scanf("%d",&n);
    for (int i=1,x,y;i<n;i++) read(x),read(y),add(x,y),add(y,x);
    for (int i=1;i<=n;i++) read(col[i]);
	for (int i=1;i<=n;i++) read(T[0].val[i]),T[1].val[i]=T[0].val[i];
	dfs(1),read(Q);
	for (int i=1,op,x,y;i<=Q;i++){
		read(op),read(x);
		if (op==0) printf("%d\n",T[col[x]].query(x));
		if (op==1){
			if (f[x]) T[col[x]].cut(x),T[col[x]^1].link(x);
			col[x]^=1;
		}
		if (op==2) read(y),T[0].modify(x,y),T[1].modify(x,y);
	}
	return 0;
}



告别MATLAB环境!保姆级教程:用Application Compiler把你的GUI程序打包成独立exe(2020R版本实测) 本文详细介绍了如何使用MATLAB的Application Compiler工具将GUI程序打包成独立exe文件,特别针对2020R版本进行实测。从技术原理、配置详解到打包实战与问题排查,提供完整的解决方案,帮助开发者实现无需MATLAB环境的程序分发,提升工作效率。 阅读详情

相关推荐

摄像头模组CCM简介

摄像头模组,全称Camera Compact Module,简写为CCM。CCM 包含几大件: 镜头(lens)、音圈马达(VCM)、传感器(sensor)、软板(FPC)、图像处理芯片(DSP)。工作原理:物体通过镜头(lens)聚集的光,通过CMOS或CCD集成电路,把光信号转换成电信号,再经过内部图像处理器(ISP)转换成数字图像信号输出到数字信号处理器(DSP)加工处理,转换成标准的GRB、YUV等格式图像信号。摄像头模组主要由以下几个部分组成:镜头(Lens):将光线汇聚到图像传感器上。

m0_73482095的博客 1万+

树链剖分学习笔记 && SPOJ QTREE

昨天晚上脑子一抽,冒出来一个想法:“我要学树剖!”然后,今天下午+晚上就砸给了树剖….讲真,NOIP之前学省选内容并不好…我这是在作死…..——前言。树链剖分,计算机术语,指一种对树进行划分的算法,它先通过轻重边剖分将树分为多条链,保证每个点属于且只属于一条链,然后再通过数据结构(树状数组、SBT、SPLAY、线段树等)来维护每一条链。(来自度娘百科)一般是用线段树来维护吧….看上去代码很长,其实主

Chlorineひかりのblog 558

FUXA实战:5步搞定基于Web的SCADA系统搭建(含Node.js版本避坑指南)

本文提供了一份基于开源工具FUXA搭建Web版SCADA系统的实战指南。文章重点解析了从环境准备到生产部署的五个核心步骤,并特别强调了Node.js版本选择对西门子S7 PLC通信兼容性的关键影响,帮助开发者避开常见陷阱,快速构建工业监控界面。

weixin_29172963的博客 140

qtree(树链刨分)

题意:给一棵树,两种操作:一条路径上所有数模一个值,求路径上的最大值。 一个数模一个比他小的数,再怎么都会至少减半,所以模可以暴力搞,总的暴力修改的次数在nlogn以内。其它的就好办了。 以前遇到过类似思路的题,有区间开根号,区间取对数的,这些都是下降得特别快的所以暴力来搞,这次在考场上由于一开始看错题了所以没想出来,以后要注意这类问题。 #include #include #inc

AZUI _ oi memories 675

【UOJ170】Picks loves segment tree VIII

【题目链接】 点击打开链接 【前置阅读】 【BZOJ4695】最假女选手 【BZOJ3064】【TYVJ1518】CPU监控【UOJ169】【UR #11】元旦老人与数列 【思路要点】 前置阅读中的前两题中,我们分别对线段树的区间取最大/最小值和线段树的历史最大/最小值进行了研究。本题中,两类问题同时出现,因此我们

cz_xuyixuan的博客 1247

【YOLOv8全方位学习手册】第四章 数据增强:从扩充数据到塑造模型的认知边界

"""使用 Albumentations 做自定义增强,兼容 YOLO 格式"""])# 转成 numpy# boxes 必须是 [[x_min,y_min,x_max,y_max], ...]# 在数据加载时调用你可以把集成到 PyTorch 的 Dataset 类里,或使用 Ultralytics 自带的DataLoader。

VectorShift的博客 211

Qt QTreeWidet控件详解

除了使用上面这种方法之外,还可以使用QList&items实现结点的添加。QT中对C++中的STL库中的容器使用进行了封装,使用其封装的类可以很方便的解决很多类似很复杂数据结构的问题。②添加风格ui->treeWidget->setStyle(QStyleFactorycreate("windows"));某一项发生改变,要判断previous是否为空。设置垂直滚动条策略,设置是否显示滚动条。设置水平滚动条策略,设置是否显示滚动条。.........

陈子青的博客 1506

自抗扰控制(ADRC)理论与工程实践:8.2 模糊ADRC、神经网络ADRC等智能融合变体

智能融合ADRC变体概述 自抗扰控制(ADRC)与智能控制方法(如模糊逻辑、神经网络)的融合,旨在突破传统ADRC在非线性、时变系统中的应用局限。智能融合ADRC主要通过以下方式实现性能提升: 模糊ADRC 参数自整定:利用模糊推理在线调节ADRC带宽参数,实现自适应控制。 非线性反馈:用模糊控制器替代线性PD,灵活设计非线性控制策略。 优势:融入专家经验,无需精确模型;局限:依赖规则库设计,稳定性分析困难。 神经网络ADRC 增强ESO:用神经网络学习扰动动态,提高估计精度。

技术工作者 226

Qt QTreeWidget树形控件用法详解

通过先将 item 和 item2 添加到 items 容器中,然后再将 items 传递给 treeWidget 对象的 addTopLevelItems() 方法,就可以将 items 容器中的所有结点添加到 treeWidget 控件中,作为该控件的顶层结点。图 2 中显示的数字 1,是 QTreeWidget 控件中的表头,默认情况下 QTreeWidget 只有一个表头,表头的内容就是 1。当为新建 QTreeWidget 对象指定父窗口后,它将作为该窗口中的一个控件(如图 2a) );

qq_41854911的博客 6150

【Agent从入门到实践】40 容错优化:异常处理、重试机制、降级策略

各位小伙伴,咱们的多Agent框架一路优化到现在,决策快、执行效率高、资源用得省,看似啥都行,但只要一遇到网络波动、工具故障、数据异常调用web_search工具时网络超时,整个检索任务直接失败,写作Agent没数据可用向量库连接异常,向量检索直接崩掉,依赖检索结果的Agent全趴窝单个Agent执行出错,整个并行任务流程直接中断,前功尽弃高并发下部分工具调用失败,框架没有备用方案,只能返回任务失败说白了,咱们之前的框架只有正常执行逻辑,没有异常兜底逻辑。

人工智能AI技术 910

OpenSpec 完全指南 config.yaml文件

不管是项目内还是全局存放,自定义工作流都要遵守以下规则,否则会导致OpenSpec无法识别,新手一定要记牢:一个文件夹 = 一个工作流:工作流文件夹的名称,就是中schema字段要填写的名称;每个工作流文件夹必须包含:这是工作流的核心定义文件,没有它,OpenSpec无法识别这个工作流;模板文件统一放templates/目录:如果需要自定义生成文件的模板(比如统一的提案模板、任务模板),就放在工作流文件夹下的templates/里,OpenSpec会自动识别;

h a 6 6 6 c k 为 你解决复杂难题! 1419

Qt QTreeWidget树形控件用法详解_qt 树控件,2024年最新Golang详解

通过先将 item 和 item2 添加到 items 容器中,然后再将 items 传递给 treeWidget 对象的 addTopLevelItems() 方法,就可以将 items 容器中的所有结点添加到 treeWidget 控件中,作为该控件的顶层结点。图 2 中显示的数字 1,是 QTreeWidget 控件中的表头,默认情况下 QTreeWidget 只有一个表头,表头的内容就是 1。QTreeWidgetItem 还提供了很多实用的成员方法,下表罗列了一些常用的方法。

2401_84263282的博客 1552

【Bug已解决】Claude Team Plan 购买席位报错 Payment failed 解决方案

方案适用场景推荐指数检查账单历史状态排查的第一步⭐⭐⭐⭐⭐更换支付方式类型快速尝试是否能绕开问题⭐⭐⭐联系官方支持团队最终解决问题的正规渠道⭐⭐⭐⭐⭐临时过渡方案紧急用人需求的应急处理⭐⭐⭐关注官方修复进度确认属于系统性缺陷的场景⭐⭐⭐⭐Claude Team Plan 增购席位报的问题,社区反馈和实际排查表明很大概率属于平台计费系统在处理按比例分摊费用这类复杂计算链路时的系统性缺陷,而不是用户自身的支付信息填写有误。先排除自身账单历史是否存在异常。

一键难忘的博客 4181

【LCT】【QTREE5】Query on a tree V

http://www.spoj.com/problems/QTREE5/en/ 看别人代码理解的LCT。。。 想了好久,终于明白up()函数是什么意思了。。。。 不明白为什么可以没有flip #include #include #include #include #include #include #include using namespace std;

willinglive 999

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

QTREE5 - Query on a tree V【LCT】

题目链接 你被给定一棵n个点的树,点从1到n编号。每个点可能有两种颜色:黑或白。我们定义dist(a,b)为点a至点b路径上的边个数。 一开始所有的点都是黑色的。 要求作以下操作: 0 i 将点i的颜色反转(黑变白,白变黑) 1 v 询问dist(u,v)的最小值。u点必须为白色(u与v可以相同),显然如果v是白点,查询得到的值一定是0。 特别地,如果作'1'操作时树上没有白点,输出-...

既然弱小,就只顾变强就是了 404

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

SP16580 QTREE7 - Query on a tree VII

SP16580 QTREE7 - Query on a tree VII 题目描述 传送门 题目分析 首先1,2操作就是喜闻乐见的基本操作。可以开两棵LCT,然后分别维护两种颜色。 对于0操作,实际上是查询子树最大值的一个操作。考虑子树和是如何维护的,我们设置了一个\(si\)数组单独维护。可以考虑设置一棵平衡树来达到\(si\)数组的作用。具体的可以,嗯,看一看代码。 是代码呢 #includ...

weixin_30919235的博客 114

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

QTREE4 - Query on a tree IV【LCT】

题目链接 给定一棵n个点的带边权的树,点从1到n编号。每个点可能有两种颜色:黑或白。我们定义dist(a,b) 为点a至点b路径上的权值之和。 一开始所有的点都是白色的。 要求作以下操作: C a将点a的颜色反转。(黑变白,白变黑) A询问dist(a,b) 的最大值。a,b点都必须为白色(a与b可以相同),显然如果树上仍存在白点,查询得到的值一定...

既然弱小,就只顾变强就是了 393

QTREE5 - Query on a tree V——LCT

QTREE5 - Query on a tree V 动态点分治和动态边分治用Qtree4的做法即可。 LCT: 换根后,求子树最浅的白点深度。 但是也可以不换根。类似平常换根的往上g,往下f的拼凑 考虑深度的pushup必须考虑原树结构的联系,而ch[0],ch[1]又不是直接的前驱后继,每次pushup还要找前驱后继答案,还不如直接记下来。 故,节点里维护: 1.sz,大小 ...

weixin_33963189的博客 210

Query on a tree 【SPOJ - QTREE】【LCT】

题目链接 就是两个问题,改变树上的一个点的值,以及查询一段链上的最大值问题。 我们直接拆点,并且构建LCT树,然后直接查询即可,模版题。 #include <iostream> #include <cstdio> #include <cmath> #include <string> #include <cstring> #i...

既然弱小,就只顾变强就是了 247

SPOJ16580 BZOJ3639 QTREE7 - Query on a tree VII LCT

题目链接 题意: 给你一个nnn个点的树,每个点有点权和一个颜色,颜色是黑白之一。有mmm次操作,每次有三种可能的操作,第一种是修改一个点的颜色,第二种是修改一个点的权值,第三个是给你一个xxx,问所有到xxx路径上颜色全相同点的最大权值。n,m&lt;=1e5n,m&lt;=1e5n,m<=1e5。 题解: 和QTREE6差不多,但是这次是维护子树最大值。我们在之前的思路上...

forever_shi的博客 224

Query on a tree V VI VII [LCT]

QTREE5 操作 : 反转某个点的颜色, 查询某个点的最近白点 我们维护Splay中, 最浅节点到最近白点的距离(lsum), 以及最深节点到它的最近白点的距离(rsum) 那么查询x的答案很明显 Accss(x), Splay(x), x -> rsum 就是答案 考虑如何 Pushup Minson是虚子树答案, 用一个set维护 #include<bits/s...

FSYo 的博客 286

[QTree6]Query on a tree VI

Description: 给你一棵n个点的树,编号1~n。每个点可以是黑色,可以是白色。初始时所有点都是黑色。下面有两种操作请你操作给我们看: 0 u:询问有多少个节点v满足路径u到v上所有节点(包括)都拥有相同的颜色 1 u:翻转u的颜色 Hint: \(n\le 10^5\) Solution: 这题我一开始用树剖写,然后随机数据跑得飞快,交上去被菊花图卡飞23333333 树剖正解,详见ht...

weixin_30480651的博客 172

洛谷SP16549 QTREE6 - Query on a tree VI(LCT)

洛谷题目传送门 思路分析 题意就是要维护同色连通块大小。要用LCT维护子树大小就不说了,可以看看蒟蒻的LCT总结。 至于连通块如何维护,首先肯定可以想到一个很naive的做法:直接维护同色连通块,每次更改时暴力修改父边和子边。。。。。。 来个菊花图吧!(话说我真的好弱,前几天ZJOI的时候才知道对于某点度数很大的树/图有这样的称呼,真是很形象哈23333) 既然这条路行不通,那就换一种模...

a83229442的博客 182

SP16580 QTREE7 - Query on a tree VII(LCT)

和QTree6QTree6QTree6的思路类似。 同样是两棵树,同样是维护那些信息,但是这次变成了维护最值。 那么维护虚+实的mxmxmx数组肯定是照常维护。 但是虚子树的应该怎么办呢? 考虑到涉及到撤销这个东西,所以需要multisetmultisetmultiset (注意删除一个值的时候,要删除地址而不是那个值) 我们可以对于每个点都开一个multisetmultisetmultiset来...

y_immortal的博客 QwQ(qdez_ymh) 257

SP16549 QTREE6 - Query on a tree VI LCT维护颜色联通块

\(\color{#0066ff}{ 题目描述 }\) 给你一棵n个点的树,编号1~n。每个点可以是黑色,可以是白色。初始时所有点都是黑色。下面有两种操作请你操作给我们看: 0 u:询问有多少个节点v满足路径u到v上所有节点(包括)都拥有相同的颜色 1 u:翻转u的颜色 \(\color{#0066ff}{输入格式}\) 一行一个整数n 接下来n-1行,每行两个整数表示一条边 接下来一行一个整数m...

weixin_30399871的博客 138
上一篇: 挖坑
下一篇: jsoi2015R2D2和R3D1测试总结
thy_asdf
博客等级 码龄12年 16粉丝 186原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值