首页 > 其他分享 >8.17模拟赛小结

8.17模拟赛小结

时间:2023-08-17 16:48:12浏览次数:43  
标签:sx return point int void tr 8.17 小结 模拟

前言

最卡常的一集

T1 激光通讯 原题

题意:给你一个大小不超过 \(100\times 100\) 的矩阵 其中有一个起点,终点和一些障碍物 求从起点到终点不碰到障碍物的最小转弯次数

思考 一开始肯定是想记忆化 dfs 但是那样写了下发现麻烦 于是 改成了 bfs
容易发现转弯次数能小就小 所以将普通的队列改成一个堆即可
时间复杂度 \(O(n^2\log n^2)\)

Code

#include<bits/stdc++.h>
#define N 105
using namespace std;
int n,m,sx,sy,ex,ey,ans=1e9;
char c[N][N];
int vis[N][N][2];//0横1竖 
int dx[]={0,0,1,-1},dy[]={1,-1,0,0};
struct point {
	int x,y,w,v;
};
bool operator < (point a,point b)
{
	return a.v>b.v;
}
priority_queue <point> q; 
void bfs()
{
	q.push((point){sx,sy,0,0});
	q.push((point){sx,sy,1,0});
	while(!q.empty())
	{
		point x=q.top();
		q.pop();		
		if(x.x>n||x.y>m||x.x<1||x.y<1||c[x.x][x.y]=='*') continue;
		if(x.x==ex&&x.y==ey)
			ans=min(ans,x.v);
		vis[x.x][x.y][x.w]=1;
		for(int i=0;i<2;i++)
		{
			int xx=x.x+dx[i],yy=x.y+dy[i];
			if(vis[xx][yy][0]) continue;
			q.push((point){xx,yy,0,x.v+x.w});
		}
		for(int i=2;i<4;i++)
		{
			int xx=x.x+dx[i],yy=x.y+dy[i];
			if(vis[xx][yy][1]) continue;
			q.push((point){xx,yy,1,x.v+1-x.w});
		}
	}
}
int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0);
	cin>>m>>n;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
		{
			cin>>c[i][j];
			if(c[i][j]=='C')
				if(sx==0) sx=i,sy=j;
				else ex=i,ey=j;
		}
	bfs();
	cout<<ans;
	return 0;
}

T2 树

题意:已知一棵二叉树点的编号为 \(1\to n\) 且中序遍历也为 \(1\to n\) 给出这棵树的层次遍历 求这棵树的先序遍历

思考:了解过平衡树 BST 堆之类的就知道 原树就是一个 BST 因此满足左儿子小于根 右儿子大于根的性质 因此每个子树都必定是一个区间 然后这个子树的根就是层次遍历最靠前的点 于是用一棵线段树维护即可 时间复杂度 \(O(n\log n)\)

#include<bits/stdc++.h>
#define N 300005
using namespace std;
int n,a[N],id[N];//id:每个数的下标 
int tr[4*N];
void Pushup(int x)
{
	if(id[tr[x*2]]>id[tr[x*2+1]]) tr[x]=tr[x*2+1];
	else tr[x]=tr[x*2];
}
void builds(int l,int r,int x)
{
	if(l==r)
	{
		tr[x]=l;
		return;
	}
	int mid=(l+r)/2;
	builds(l,mid,x*2);
	builds(mid+1,r,x*2+1);
	Pushup(x);
}
int query(int l,int r,int L,int R,int x)
{
	if(l>R||r<L) return -1;
	if(l>=L&&r<=R) return tr[x];
	int mid=(l+r)/2;
	int ls=query(l,mid,L,R,x*2),rs=query(mid+1,r,L,R,x*2+1);
	if(ls==-1) return rs;
	if(rs==-1) return ls;
	if(id[ls]>id[rs]) return rs;
	return ls;
}
void solve(int l,int r)
{
	if(l>r) return;
	int root=query(1,n,l,r,1);
	printf("%d ",root);
	solve(l,root-1);
	solve(root+1,r);
}
int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
		scanf("%d",&a[i]),id[a[i]]=i;
	builds(1,n,1);
	solve(1,n);
	return 0;
}

T3 石头剪刀布

image
\(n\leq 2000\)

很毒瘤
错误的思路:前\(i\)个数最长上升序列长度为\(j\) 钦定每次最后取的数是 \(k\) 的方案数
因为这道题要求的是全局 所以不能钦定

标签:sx,return,point,int,void,tr,8.17,小结,模拟
From: https://www.cnblogs.com/g1ove/p/17638049.html

相关文章

  • Autodesk Inventor Professional 2024(三维可视化实体模拟软件)中文永久使用
    AutodeskInventorProfessional2024是一款功能强大的三维计算机辅助设计(CAD)软件,以下是对其的详细介绍:点击获取AutodeskInventorProfessional2024 三维建模工具:AutodeskInventorProfessional2024提供了丰富的三维建模工具,使用户能够创建复杂的实体模型。用户可以......
  • 2023.8.17
    //1.约束//2.用inteface定义,不可实例化,没有构造方法//3.用implements可实现多个接口//接口publicinterfaceService{//用interface定义接口//在接口中定义的属性,都是常量publicstaticfinalintAGE=99;publicstaticfinalintheight=180;......
  • 利用队列的内置模块(deque)模拟 Linux 下的 tail 命令(输出文件中最后几行的内容)
    博客地址:https://www.cnblogs.com/zylyehuo/#-*-coding:utf-8-*-fromcollectionsimportdequedeftail(n):#n:指定输出文件中最后几行withopen('test.txt','r')asf:q=deque(f,n)returnqforlineintail(5):print......
  • 模拟集成电路设计系列博客——1.1.4 Wilson电流镜
    1.1.4Wilson电流镜另一种高输出阻抗的电流镜是Wilson电流镜,如下图所示:这是一个使用串联-分流反馈来提升输出阻抗的例子,\(Q_2\)获得输出电流将其镜像给\(I_{D1}\),其反过头来与\(I_{in}\)相减。注意\(I_{D1}\)必须精确等于\(I_{in}\),否则\(Q_3\)和\(Q_4\)的栅压将会增加或减少,负......
  • 8.17集训笔记
    上午二维数组/函数B2101计算矩阵边缘元素之和点击查看代码#include<bits/stdc++.h>usingnamespacestd;constintN=110;intn,m,a[N][N];intmain(){cin>>n>>m;for(inti=1;i<=n;i++)for(intj=1;j<=m;j++)cin>>a[i][j];int......
  • Set A Light 3D Studio Mac三维模拟影棚布光软件
    SetALight3DStudio是一款全新的专业三维模拟影棚灯光布光软件,支持在Mac平台上制作虚拟摄影棚,能够快速制作出真实影棚布光效果,可以使用专业的灯光器材和道具。软件功能强大,操作简单,是一款功能强大的专业三维模拟影棚灯光软件。SetALight3DStudioMac版是一个全新的专业三维模......
  • 2023.8.16模拟赛总结
    T1Idiot的乘幂题目大意就是给\(a,b,c,d,p\)满足求解这题考场一开始发现\(\gcd(a,c)=1\)没啥用,后来发现其实很巧妙,直接辗转相除\(a,c\)同时维护\(\chi^a,\chi^c\)最后剩下来的就是\(\chi\)当然题解给了一个鬼才想到的做法构造\(\chi=\chi^1=\chi^{ax+cy}\)所以可以用exgc......
  • string类的模拟实现
    一、C语言中的string类C语言中,字符串是以‘\0’结尾的一些字符集合,为了操作方便,C标准库中提供了一些str系列的库函数,但这些库函数与字符串是分离的,不太符合OOP的思想,而且底层空间需要用户自己管理,稍不留神可能还会访问越界。二、C++中的string类1、string类string类的文档介绍:cplus......
  • stack模拟实现
    stack模拟实现我们用适配器模式/配接器模式,本源是转换,把已有的东西进行转换。设计模式:把常见的设计方法进行总结,适配器也是一种设计模式。我们用已有的容器封装:可以这样定义类模板template<classT,classContainer>,Container就是符合我们要求的一个容器。我们可以将头文件写在......
  • 8.16 模拟赛小结
    前言最____的一集题目是从正睿OI捞过来的找不到原题T1文件改名\(n\leq10^5\)题意简要:有一堆文件要改名保证初始的和改正后的名字都没重复且更改过程中不予许出现重复求最小操作步数思考:这题推一下就行若是状态转移把这个东西丢到图上发现可以直接跳过\(s_i=t_i......