BZOJ 1058 [ZJOI2007]报表统计

题解:

SB的我打了无旋Treap,然后在洛谷上光荣的T了

BZOJ极限卡时A了

 (每个初始位置后面加入的数)的影响是可以直接算的,然后初始位置之间的影响用平衡树(线段树)来维护即可

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<map>
using namespace std;
const int maxn=1000009;
const int oo=1000000000;

int n,TT;

int abs(int x){
	if(x<0)return -x;
	else return x;
}

int nn=0,root=0;
int ch[maxn][2]={0},fix[maxn]={0},siz[maxn]={0},kyl[maxn]={0},kyr[maxn]={0},tl[maxn]={0},tr[maxn]={0},mn[maxn]={0};
void pushup(int x){
	siz[x]=siz[ch[x][0]]+siz[ch[x][1]]+1;
	if(ch[x][0]&&ch[x][1]){
		tl[x]=tl[ch[x][0]];
		tr[x]=tr[ch[x][1]];
		mn[x]=min(min(min(mn[ch[x][0]],mn[ch[x][1]]),abs(kyr[x]-tl[ch[x][1]])),abs(kyl[x]-tr[ch[x][0]]));
	}else if(ch[x][0]){
		tl[x]=tl[ch[x][0]];
		tr[x]=kyr[x];
		mn[x]=min(mn[ch[x][0]],abs(kyl[x]-tr[ch[x][0]]));
	}else if(ch[x][1]){
		tl[x]=kyl[x];
		tr[x]=tr[ch[x][1]];
		mn[x]=min(mn[ch[x][1]],abs(kyr[x]-tl[ch[x][1]]));
	}else{
		tl[x]=kyl[x];
		tr[x]=kyr[x];
		mn[x]=oo;
	}
}

int NewNode(int a,int b){
	int x=++nn;
	fix[x]=rand();
	siz[x]=1;
	kyl[x]=tl[x]=a;
	kyr[x]=tr[x]=b;
	mn[x]=oo;
	return x;
}

int Mer(int x,int y){
	if((!x)||(!y))return x+y;
	
	if(fix[x]<fix[y]){
		ch[x][1]=Mer(ch[x][1],y);
		pushup(x);
		return x;
	}else{
		ch[y][0]=Mer(x,ch[y][0]);
		pushup(y);
		return y;
	}
}

void Split(int now,int k,int &x,int &y){
	if(!now){
		x=y=0;
	}else{
		int l=ch[now][0];
		if(k>=siz[l]+1){
			x=now;
			Split(ch[now][1],k-(siz[l]+1),ch[now][1],y);
		}else{
			y=now;
			Split(ch[now][0],k,x,ch[now][0]);
		}
		pushup(now);
	}
}

void Updatapoint(int x,int k,int a){
	int l=ch[x][0];
	if(k==siz[l]+1){
		kyr[x]=a;
	}else if(k<siz[l]+1){
		Updatapoint(ch[x][0],k,a);
	}else if(k>siz[l]+1){
		Updatapoint(ch[x][1],k-(siz[l]+1),a);
	}
	pushup(x);
}
int sortgap=oo,nextgap=oo;

vector<int>G[maxn];

map<int,int>ma;
int main(){
	srand(19260817);
	scanf("%d%d",&n,&TT);
	for(int i=1;i<=n;++i){
		int x;scanf("%d",&x);
		G[i].push_back(x);
		root=Mer(root,NewNode(x,x));
		
		if(ma.count(x))sortgap=0;
		ma[x]=1;
		map<int,int>::iterator it=ma.lower_bound(x);
		if(it!=ma.begin()){
			--it;
			sortgap=min(sortgap,abs(x-(it->first)));
			++it;
		}
		++it;
		if(it!=ma.end())sortgap=min(sortgap,abs(x-(it->first)));
	}
	
	while(TT--){
		char opty[20];
		scanf("%s",opty);
		int x,y,z,k,a;	
		if(opty[4]=='R'){
			scanf("%d%d",&k,&a);
			G[k].push_back(a);
			int m=G[k].size();
			nextgap=min(nextgap,abs(G[k][m-2]-G[k][m-1]));
			Updatapoint(root,k,a);
//			Split(root,k,x,z);
//			Split(x,k-1,x,y);
//			root=Mer(Mer(x,NewNode(G[k][0],G[k][m-1])),z);
			
			if(ma.count(a))sortgap=0;
			ma[a]=1;
			map<int,int>::iterator it=ma.lower_bound(a);
			if(it!=ma.begin()){
				--it;
				sortgap=min(sortgap,abs(a-(it->first)));
				++it;
			}
			++it;
			if(it!=ma.end())sortgap=min(sortgap,abs(a-(it->first)));
			ma[a]=1;
		}
		if(opty[4]=='G'){
			printf("%d\n",min(nextgap,mn[root]));
		}
		if(opty[4]=='S'){
			printf("%d\n",sortgap);
		}
	}
	return 0;
}

  

转载于:https://www.cnblogs.com/zzyer/p/8490936.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。
题目描述 有一个 $n$ 个点的棋盘,每个点上有一个数字 $a_i$,你需要从 $(1,1)$ 走到 $(n,n)$,每次只能往右或往下走,每个格子只能经过一次,路径上的数字和为 $S$。定义一个点 $(x,y)$ 的权值为 $a_x+a_y$,求所有满足条件的路径中,所有点的权值和的最小值。 输入格式 第一行一个整数 $n$。 接下来 $n$ 行,每行 $n$ 个整数,表示棋盘上每个点的数字。 输出格式 输出一个整数,表示所有满足条件的路径中,所有点的权值和的最小值。 数据范围 $1\leq n\leq 300$ 输入样例 3 1 2 3 4 5 6 7 8 9 输出样例 25 算法1 (树形dp) $O(n^3)$ 我们可以先将所有点的权值求出来,然后将其看作是一个有权值的图,问题就转化为了在这个图中求从 $(1,1)$ 到 $(n,n)$ 的所有路径中,所有点的权值和的最小值。 我们可以使用树形dp来解决这个问题,具体来说,我们可以将这个图看作是一棵树,每个点的父节点是它的前驱或者后继,然后我们从根节点开始,依次向下遍历,对于每个节点,我们可以考虑它的两个儿子,如果它的两个儿子都被遍历过了,那么我们就可以计算出从它的左儿子到它的右儿子的路径中,所有点的权值和的最小值,然后再将这个值加上当前节点的权值,就可以得到从根节点到当前节点的路径中,所有点的权值和的最小值。 时间复杂度 树形dp的时间复杂度是 $O(n^3)$。 C++ 代码 算法2 (动态规划) $O(n^3)$ 我们可以使用动态规划来解决这个问题,具体来说,我们可以定义 $f(i,j,s)$ 表示从 $(1,1)$ 到 $(i,j)$ 的所有路径中,所有点的权值和为 $s$ 的最小值,那么我们就可以得到如下的状态转移方程: $$ f(i,j,s)=\min\{f(i-1,j,s-a_{i,j}),f(i,j-1,s-a_{i,j})\} $$ 其中 $a_{i,j}$ 表示点 $(i,j)$ 的权值。 时间复杂度 动态规划的时间复杂度是 $O(n^3)$。 C++ 代码

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值