可持久化作业(上)

全序开题
准备打假

A.CF757G Can Bash Save the Day?

树上动态求 p l . . . p r p_l...p_r pl...pr x x x的距离和,支持交换 p x , p x + 1 p_x,p_{x+1} px,px+1
可持久化点分树,答案为第 r r r个版本上点分树的答案减去第 l − 1 l-1 l1个版本上点分树的答案,修改就是对第 x x x个版本的单点修改。
因为可持久化需要把到儿子的链接全部复制(如果你写自底向上的点分树也一样需要把儿子到父亲的链接全部修改),所以儿子个数太多可持久化复杂度就没有保证,需要三度化原图后再进行点分治。
UPD:仔细想了一想,如果要维护 f a fa fa的可持久化数组的话,那么一次修改好像需要改整个子树,所以自底向上好像根本写不了的样子,就照可持久化线段树的写法写吧。

A C   C o d e \mathcal AC \ Code AC Code

//11:06~12:12
//Can Bush Save the Day ? 
#include<bits/stdc++.h>
#define maxn 400005
#define maxp maxn * 20
#define lim 30
#define LL long long
#define pb push_back
#define pii pair<int,LL>
#define mp make_pair
#define Fi first
#define Se second
#define rep(i,j,k) for(int i=(j),LIM=(k);i<=LIM;i++)
#define per(i,j,k) for(int i=(j),LIM=(k);i>=LIM;i--)
using namespace std;

char cb[1<<16],*cs=cb,*ct=cb;
#define getc() (cs==ct&&(ct=(cs=cb)+fread(cb,1,1<<16,stdin),cs==ct)?0:*cs++)
void read(int &res){
   
	char ch;
	for(;!isdigit(ch=getc()););
	for(res=ch-'0';isdigit(ch=getc());res=res*10+ch-'0');
}

const int M = (1 << 30) - 1;
int n,q,a[maxn],cnt_p;
int sz[maxn],dep[maxn],rt[maxn],st[maxn],ed[maxn],id[maxp],tot;
LL ds[maxn][lim],Sm[maxp],Sz[maxp],Smf[maxp],Szf[maxp];
vector<pii >tE[maxn],E[maxn];
vector<int>G[maxp];

void dfs0(int u,int ff){
   
	int p=0;
	for(auto v:tE[u]) if(v.Fi^ff){
   
		if(!p){
   
			E[u].pb(mp(v.Fi,v.Se));
			E[v.Fi].pb(mp(u,v.Se));
			p = u;
		}
		else{
   
			int t = ++cnt_p;
			E[p].pb(mp(t,0));
			E[t].pb(mp(p,0));
			
			E[t].pb(mp(v.Fi,v.Se));
			E[v.Fi].pb(mp(t,v.Se));
			p = t;
		}
		dfs0(v.Fi,u);
	}
}

void dfs1(int u,int ff,int tsz,int &mn,int &rt){
   
	int mx = 0;sz[u] = 1;
	for(auto v:E[u]) if(v.Fi^ff && !dep[v.Fi])
		dfs1(v.Fi,u,tsz,mn,rt),sz[u]+=sz[v.Fi],mx=max(mx,sz[v.Fi]);
	if((mx=max(mx,tsz-sz[u])) < mn)
		mn = mx , rt = u;
}

int Gert(int u,int tsz){
   
	int mn,rt;
	dfs1(u,0,tsz,mn=0x3f3f3f3f,rt=-1);
	return rt;
}

void dfs2(int u,int ff,LL dis,int d){
   
	ds[u][d] = dis;sz[u] = 1;
	for(auto v:E[u]) if(v.Fi^ff && !dep[v.Fi])
		dfs2(v.Fi,u,dis+v.Se,d),sz[u]+=sz[v.Fi];
}

void Build(int u,int d){
   
	dep[u] = d;
	dfs2(u,0,0,d);
	for(auto v:E[u]) if(!dep[v.Fi]){
   
		int t = Gert(v.Fi,sz[v.Fi]);
		G[u].pb(t);
		Build(t,d+1);	
	}
}

void dfs3(int u){
   
	static int tot = 0;
	st[u] = ++tot;
	for(int v:G[u]) dfs3(v);
	ed[u] = tot;
}

void ins(int &u,int p,int d){
   
	Sm[++tot] = Sm[u] + ds[p][d] , Sz[tot] = Sz[u] + 1 , 
	Smf[tot] = Smf[u] + ds[p][d-1] , Szf[tot] = Szf[u] + 1;
	G[tot] = G[u] , id[tot] = id[u];
	u = tot;
	for(int &v:G[u]) if(st[id[v]] <= st[p] && st[p] <= ed[id[v]])
		ins(v,p,d+1);
}

LL qry(int u,int p,int d){
   
	LL r = Sm[u] + Sz[u] * ds[p][d];
	if(d>1) r -= Smf[u] + Szf[u] * ds[p][d-1];
	for(int v:G[u]) if(st[id[v]] <= st[p] && st[p] <= ed[id[v]])
		r += qry(v,p,d+1);
	return r;
}

int main(){
   
	
//	freopen("1.in","r",stdin);
	
	read(n),read(q);
	rep(i,1,n) read(a[i]);
	rep(i,1,n-1){
   
		int u,v,w;
		read(u),read(v),read(w);
		tE[u].pb(mp(v,w)),tE[v].pb(mp(u,w));
	}
	cnt_p = n;
	dfs0(1,0);
	Build(rt[0]=Gert(1,cnt_p),1);
	dfs3(rt[0]);
	rep(i,1,cnt_p) id[i] = i;tot=cnt_p;
	rep(i,1,n) ins(rt[i]=rt[i-1],a[i],1);
	LL ans = 0;
	for(int t,a,b,c;q--;){
   
		read(t);
		if(t == 1){
   
			read(a),read(b),read(c);
			int l = (ans & M) ^ a , r = (ans & M) ^ b , v = (ans & M) ^ c;
			ans = qry(rt[r],v,1) - qry(rt[l-1],v,1);
			printf("%lld\n",ans);
		}
		else{
   
			read(a);
			int x = (ans & M) ^ a;
			ins(rt[x]=rt[x-1],::a[x+1],1);
			swap(::a[x],::a[x+1]);
		}
	}
}

CF650D Zip-line

每次询问将原序列的一个点的值改变后的最长严格上升子序列的长度。
那么修改后的最长上升子序列分为经过修改点和不经过的。
不经过的可以求出每个 a a a,最靠前的 b b b使得 a r r a > a r r b arr_a > arr_b arra>arrb,且 b b b结尾的最长上升子序列长度与 a a a开头的最长上升子序列长度之和为最长上升子序列长度。
然后对于 [ a + 1 , b − 1 ] [a+1,b-1] [a+1,b1]区间取 m a x max max即可,可以用 s t st st表实现。
经过的可以用可持久化线段树简单维护。
可能对于不经过的有更优的其他做法。
UPD:不经过的可以通过判断是否每个LIS都经过这个点来得知答案是 L I S LIS LIS还是 L I S − 1 LIS-1 LIS1,可以转化为:
假设这个点 x x x结尾的 L I S LIS LIS长度是 a a a,那么就是判断是否对于所有可能在全局 L I S LIS LIS中的点 y ( y ≠ x ) y(y\neq x) y(y=x),以 y y y结尾的 L I S LIS LIS长度是否是 a a a,如果是,则有 L I S LIS LIS不经过 x x x

A C   C o d e \mathcal AC \ Code AC Code

//12:20~12:52
//Zip-Line
#include<bits/stdc++.h>
#define maxn 400005
#define maxp maxn * 50
#define rep(i,j,k) for(int i=(j),LIM=(k);i<=LIM;i++)
#define per(i,j,k) for(int i=(j),LIM=(k);i>=LIM;i--)
using namespace std;

char start;

int n,m,a[maxn],b[maxn];
int h[maxn],sb[maxn<<1],rt[2][maxn],f[2][maxn],lc[maxp],rc[maxp],mx[maxp],in[maxn],tot;
vector<int>G[maxn];
void ins(int &u,int l,int r,int p,int v){
   
	lc[++tot] = lc[u] , rc[tot] = rc[u] , mx[tot] = max(mx[u] , v);
	u = tot;
	if(l == r) return;
	int m = l+r 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源
大学生在线租房平台管理系统按照操作主体分为管理员和用户。管理员的功能包括报修管理、报修评价管理、字典管理、房东管理、房屋管理、房屋收藏管理、房屋留言管理、房屋租赁管理、租房论坛管理、公告信息管理、留言板管理、用户管理、管理员管理。用户的功能等。该系统采用了Mysql数据库,Java语言,Spring Boot框架等技术进行编程实现。 大学生在线租房平台管理系统可以提高大学生在线租房平台信息管理问题的解决效率,优化大学生在线租房平台信息处理流程,保证大学生在线租房平台信息数据的安全,它是一个非常可靠,非常安全的应用程序。 管理员权限操作的功能包括管理公告,管理大学生在线租房平台信息,包括房屋管理,培训管理,报修管理,薪资管理等,可以管理公告。 房屋管理界面,管理员在房屋管理界面中可以对界面中显示,可以对房屋信息的房屋状态进行查看,可以添加新的房屋信息等。报修管理界面,管理员在报修管理界面中查看报修种类信息,报修描述信息,新增报修信息等。公告管理界面,管理员在公告管理界面中新增公告,可以删除公告。公告类型管理界面,管理员在公告类型管理界面查看公告的工作状态,可以对公告的数据进行导出,可以添加新公告的信息,可以编辑公告信息,删除公告信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值