首页 > 其他分享 >《LGJOJ 8.25》 测试总结

《LGJOJ 8.25》 测试总结

时间:2023-08-25 16:44:25浏览次数:34  
标签:return int tr mex 8.25 MAXN 测试 ans LGJOJ

纯菜了,属于是。

中间还咕了很多场总结。。。

\(T1\) 简单游戏

输入:

输出:

\(\color{red}analysis:\)

考试的时候看错题了,寄。

正常做就是直接暴力区间 \(dp\) 就好了

就是正常的博弈论 \(dp\)

其他没什么好说的了,时间复杂度 \(O(n^2)\)

\(PS:\) 挂成了 \(30pts\)

\(PS:\) 没加记忆化都过了, \(gj\) 的数据不做评价。

点击查看代码
#include<bits/stdc++.h>
typedef long long LL;

using namespace std;
const int MAXN=2010;
int T,n;
int f[MAXN][MAXN];
char st[MAXN];
int pd(int x,int y) {
	if(x<y) return 1;
	if(x==y) return 0;
	if(x>y) return 2;
}
void dfs(int opt,int l,int r,int cc) {
	if(l>r) return ;
	if(f[l][r]!=-1) return ; 
	if(!opt) {
		dfs(opt^1,l+1,r,st[l]);
		int u=f[l+1][r];
		dfs(opt^1,l,r-1,st[r]);
		int v=f[l][r-1];
		if(u==1||v==1) f[l][r]=1;
		else if(!u||!v) f[l][r]=0;
		else f[l][r]=2;
	}
	else {
		if(st[l]<cc||st[r]<cc) {
			f[l][r]=2;
			return ;
		}
		else if(st[l]==cc||st[r]==cc) {
			if(l==r) {
				f[l][r]=0;
				return ;
			}
			int u=1,v=1;
			if(st[l]==cc) {
				dfs(opt^1,l+1,r,cc);
				u=f[l+1][r];
			}
			if(st[r]==cc) {
				dfs(opt^1,l,r-1,cc);
				v=f[l][r-1];
			}
			if(u==2||v==2) f[l][r]=2;
			else if(!u||!v) f[l][r]=0;
			else f[l][r]=1;
		}
		else {
			f[l][r]=1;
		}
	}
}
int main () {
	scanf("%d",&T);
	while(T--) {
		scanf("%s",st+1);
		n=strlen(st+1);
		for(int i=1;i<=n;++i) {
			for(int j=1;j<=n;++j) {
				f[i][j]=-1;
			} 
		}
		dfs(0,1,n,0);
		if(f[1][n]==0) puts("Draw");
		if(f[1][n]==1) puts("Alice");
		if(f[1][n]==2) puts("Bob");
	}
	return 0;
}

\(T2\) 内鬼

输入:

输出:

2

\(\color{blue}analysis:\)

首先我们考虑暴力 \(f_{i,j,S}\) 表示两个内鬼分别在 \(i,j\) 位置,抓到 \(S\) 这个集合里人所耗费的最少时间,然后我们可以获得一个 \(O(en^22^8)\) 的优秀解法,可以获得 \(30pts\)

\(if(dis[i][t]\le e[i].time-f_{i,j,S})\) 如果满足这个条件,我们的 \(dp\) 就可以转移,所以我们需要预处理

但是这样还不够,由于 \(t3\) 便秘时间过长,耗费了将近 \(1h\) 没想到怎么做,于是就回来写这题,突然想到两个内鬼可以拆开计算,然后枚举两个内鬼分别抓捕的人的集合,分别拆成 \(f_{x,S'},f_{y,S''}\) 。

然后具体能不能做到 \(50pts\) 那一档部分分呢,我觉得应该是可以搞到 \(en2^8\) 的,然后拿 \(50pts\)。

然后由于如果我们想拿 \(100pts\) ,我们就绝对不能预处理 \(dis\) 数组,我们考虑有没有一种方法,不用预处理 \(dis\) 数组。

这时候宋哥跑过来和我说分层图,然后就恍然大悟了属于是,我们既然不能直接预处理,那么我们就考虑直接跑最短路,然后对于每个不同的集合 \(S\) ,分成一层,至多分成 \(256\) 层,然后对于每层跑一下最短路,对于那些跨越层之间的路径也是照样跑就行了。

时间复杂度 \(O((2^km+2^ke)\log (2^kn))\) 空间复杂度也比较大,一种比较好的优化方法就是先对每层跑好在去跑分层图的边,这样就不用存那么多边的信息。

\(T3\) 序列统计

\(analysis:\)

考试便秘想不出来。

首先对于 \(mex\) 有一个比较经典的操作,就是将每种数都分开来处理,从 \(1\sim m\) 来进行处理。

然后题目问最小的包含 \(1\sim m\) 的最小长度是多少,其实就是问 \(mex=i(i\in(2\sim m+1))\) 的最小的长度

\(dp\ +\) 主席树

\(\%\%\% sktn0089\ wzr\) 大神

由于我们的暴力是枚举一个左端点一直向右扫,我们考虑优化。

记 \(f_{i,0/1}\) 表示以 \(i\) 为左端点或右端点使得一段序列包含 \(1\sim a_i\) 的最小的序列长度是多少。

然后我们考虑从 \(a_i=1\) 的 \(i\) 开始枚举。

我们只对 \(f_{i,0}\) 讨论,也就是 \(i\) 为左端点进行讨论,因为为右端点也是同理即可。

我们查询 \(mex(a_i,a_{i+1}...a_{i+f_{i,0}-1})\) ,记为 \(v\) ,然后这个区间就可以贡献给 \(ans_{v}\) ,记 \(ans_v\) 为,\(mex\) 为 \(v\) 的最小序列长度。

对于如何求区间 \(mex\) 我们只需要用主席树查询 \(i+f_{i,0}-1\) 这个版本中最小的最后一次被染色的节点在 \(l\) 左边的即可,具体代码会解释。

然后我们找到这段区间右边第一个 \(a[j]=v\) 的,记为 \(R\) ,左边同理,记为 \(L\)

然后我们就更新这些对应的 \(f\) 即可。

不过注意最后的 \(ans\) 要做一个后缀最小值。

因为对于 \(1\ 3\ 2\) ,实际上找不到 \(mex=2\) 的序列,只找得到 \(mex=3\) 的序列,所以 \(ans_3\) 要贡献给 \(ans_2\) ,也就是后缀最小值。

时间复杂度 \(O(n\log n)\) 空间复杂度 \(n\log n\)

点击查看代码
#include<bits/stdc++.h>
typedef long long LL;

using namespace std;
const int MAXN=5e5+10,inf=1e9;
int n,m;
int a[MAXN],f[MAXN][2],ans[MAXN];
vector<int> e[MAXN];
int T[MAXN],tot;
struct daduoli {
	int v,l,r;
}tr[MAXN*20];
int update(int pre,int l,int r,int x,int i) {
	int nw=++tot;
	tr[nw]=tr[pre];
	if(l<r) {
		int mid=(l+r)/2;
		if(x<=mid) tr[nw].l=update(tr[pre].l,l,mid,x,i);
		else tr[nw].r=update(tr[pre].r,mid+1,r,x,i);
		tr[nw].v=min(tr[tr[nw].l].v,tr[tr[nw].r].v);//对于区间中最后出现位置的数找到一个最小值
	}
	else {
		tr[nw].v=i;//更新x最后出现位置
	}
	return nw;
}
int query(int nw,int pre,int l,int r) {
	if(tr[nw].v>=pre) return r+1;
	if(l==r) return l;
	int mid=(l+r)/2;
	if(tr[tr[nw].l].v>=pre) return query(tr[nw].r,pre,mid+1,r);//如果左区间中所有数最后出现位置都在左端点右边,那就找右区间,因为左区间全都合法
	return query(tr[nw].l,pre,l,mid);
}
int main () {
	scanf("%d%d",&n,&m);
	for(int i=1;i<=m+1;++i) ans[i]=inf;
	for(int i=1;i<=n;++i) {
		scanf("%d",&a[i]);
		e[a[i]].push_back(i);
		if(a[i]==1) f[i][0]=f[i][1]=1;
		else f[i][0]=f[i][1]=inf;
		T[i]=update(T[i-1],1,m,a[i],i);
	}
	for(int i=1;i<=m;++i) {
		for(auto t:e[i]) {
			if(f[t][0]<inf) {
				int l=t,r=t+f[t][0]-1;
				int v=query(T[r],l,1,m);
				ans[v]=min(ans[v],f[t][0]);
				auto it=lower_bound(e[v].begin(),e[v].end(),l)-e[v].begin();
				if(it<e[v].size()) f[e[v][it]][1]=min(f[e[v][it]][1],e[v][it]-l+1);
				--it;
				if(it>=0) f[e[v][it]][0]=min(f[e[v][it]][0],r-e[v][it]+1);
			}
			if(f[t][1]<inf) {
				int l=t-f[t][1]+1,r=t;
				int v=query(T[r],l,1,m);
				ans[v]=min(ans[v],f[t][1]);
				auto it=lower_bound(e[v].begin(),e[v].end(),l)-e[v].begin();
				if(it<e[v].size()) f[e[v][it]][1]=min(f[e[v][it]][1],e[v][it]-l+1);
				--it;
				if(it>=0) f[e[v][it]][0]=min(f[e[v][it]][0],r-e[v][it]+1);
			}
		}
	}
	for(int i=m;i>=2;--i) {
		ans[i]=min(ans[i],ans[i+1]);//记得取一下后缀最小值
	}
	for(int i=2;i<=m+1;++i) {
		printf("%d\n",ans[i]);
	}
	return 0;
}

线段树

听 \(forgiven\) 讲了一下。

大概是我们记录一个数组 \(f_{i,j}\) 表示从 \(i\) 开始,要使得区间 \(mex\) 为 \(j\) 的最小长度是多少,我们记下一个与 \(a[i]\) 相同的位置在 \(q\) ,满足 \(a[i]=j-1\) 。

然后我们考虑更新 \(i+1\) ,倘若把 \(i\) 删除掉,那么 \(i+1\sim (q-1)\) 里面想要凑出 \(mex=j\) 的序列,就必须要遍历到 \(q\) ,所以对 \((i+1)\sim (q-1)\) 里面的值进行一个区间取 \(max\) ,但是如果直接区间取 \(max\) ,

标签:return,int,tr,mex,8.25,MAXN,测试,ans,LGJOJ
From: https://www.cnblogs.com/ddl1no2home/p/17657349.html

相关文章

  • 电动车上架亚马逊美国站UL2272测试报告办理指南
    随着电子商务的快速发展,越来越多的产品通过亚马逊等电商平台销售。为了确保产品的安全性和质量,亚马逊美国站要求所有上架的电动车必须通过UL2272测试。本文将介绍电动车上架亚马逊美国站UL2272测试报告的办理流程和注意事项。一、UL2272测试简介UL2272测试是一种针对电动玩具和类似......
  • 测试神器!RunnerGo让你的测试工作更高效!
    引言:在软件开发领域,测试是非常重要的一环。然而,传统的测试工具往往复杂且难以使用,让测试工作变得异常繁琐。为了解决这一问题,我们迎来了RunnerGo——一款轻量级、全栈式的测试平台,让你的测试工作更加高效!一、RunnerGo是什么?RunnerGo是一款基于Go语言研发的轻量级测试平台,支持接口管......
  • 软件测试从入门到精通
    一、测试介绍软件测试概念使用技术手段验证软件是否满足要求测试主流技能1、功能测试2、自动化测试3、接口测试4、性能测试主流方向: 1、功能+接口测试 2、自动化+接口 3、功能+性能二、测试常用分类2.1阶段划分单元测试针对程序源代码进行测试(单元:最小独......
  • 确认测试\验收测试的作用
    确认测试确认测试也称为验收测试,它的目标是验证软件的有效性。通常,验证指的是保证软件正确地实现了某个特定要求的一系列活动;确认指的是为了保证软件确实满足了用户需求而进行的一系列活动。委托第三方软件测试机构出具的确认测试报告主要用于:1.企业申报国家、省、市科技成果......
  • 自动化测试相关注意事项及问题点汇总
    1、WEB自动化测试框架是如何搭建的?我们web自动化测试使用的技术栈是:Python+Selenium+Pytest+Parametrices+Excel+Allure+Jenkins框架使用的是基于Excel的关键字驱动,将维护框架和使用框架分离开来进行自动化测试时,将元素定位表达式及要执行在操作写入excel即可,显著降低了自动化......
  • 测试DE10-Standard开发板VGA接口(基于ADV7123)输出RGB彩条时显示器显示“无信号”Signal
    SignalTap工具真的是一款非常非常实用的调试工具。最近想显示VGA 三色彩条(源码:基于友晶科技FPGA开发板DE2-115和DE10-STANDARD的VGA彩条显示设计(ADV7123)),引 脚分配和控制信号的设计都检查了  没有错误。也排除了VGA显示器故障(测试DE10-Standard\Demonstration\FPGA\D......
  • 软件测试 | 测试对URL长度的处理
    问题你的应用可能无法很好地处理个别POST参数,你也应该检查应用对特别长的URL的处理方式。HTTP标准(RFC2616)中没有限制URL的长度。相反,有可能发生的的情况是你的系统中某些其他方面可能会加以限制。你需要确保以限制的方式是可预测并可接受的。解决方案有几种方案可以测试超长的URL......
  • H5专项测试
    一、用例二、工具方法    ......
  • 划船器认证测试怎么做?
    划船器(Rowingmachine),又称划船机、赛艇器、测功仪等,是以训练为目的,用来模拟水上赛艇运动的健身器材,健身器材常以训练功能多少来分为单功能和综合型多功能两大类,常用的有划船器、健美车、健步机、跑步机、美腰机等。健身器材要出口的话,就要做相关安全测试了。询:13349875850室内健身......
  • 质效提升 | 聊聊QA与业务测试
    上面一篇文章《质效提升|QA不做业务需求测试,你怎么看》主要讨论的是QA和业务需求测试相关的问题,文章发出后收到了很多小伙伴的反馈,这里把很多有意义的反馈放在下面,希望对你有用。 约翰同学:QA和测试的职能不同吧。很多时候混淆了?scmroad:是的,对于国外来说QA和Tester,区别很大......