QbztDay1游记

qbzt爆零记Day1

T1





我们为什么不把这个机器人直接报废掉呢?

素质题目

其实这就是个膜你模拟

坑点:

如果走到了水池并掉进去了,位置并不是水池前面的格子,而是执行这条指令之前的位置

来自老师的一点建议

可以分成几个独立的函数来写,例如把机器人运动和机器人旋转写到一起之类的

T2

迷路的刺豚(expand,1.5s,64M)
题目描述
有一只名叫小T的刺豚,一大早它妈妈就让它出门买菜。
它看见了一只可爱的小海马,一路追着它跑啊跑啊。
结果……小T迷路了。但妈妈在家里等得很着急,它要赶紧买完菜回家。
所以!当务之急!它要知道去买菜的路……
它记得所有菜店的坐标,也知道它现在的坐标。请你帮帮她,找到一条买完菜的路吧。
它已经急得快哭了,它想要买完菜回家。因此它需要你找到一条最短的路买菜。
由于它是一条可以膨胀的刺豚,它喜欢自己大大的体格,因此它希望在路径最短的情况下使自己的体格
最大,即在移动时离障碍尽可能远。
因为你开着上帝视角,所以你知道小T所在的地图。你能帮它找到一条路吗?
注意:
1、此处的离障碍最远是保证在任何时候、在保证路径最短的情况下离障碍最远。当然小T只需要你保证
在每个位置的体格之和尽可能大。
2、不需要考虑小T回家的路
输入格式
第一行两个数 ,表示小T所在的地图大小和小T的最大体格。
体格为 表示小T会占据 个格子。
接下来 行每行 个数字表示地图,其中‘1’表示障碍,'0'表示空地。
接下来一行三个数 表示小T所在的坐标 和菜店数量 。
接下来 行,第 两个数表示菜店 所在的坐标。
输出格式
输出两个数,表示最短路长度以及每个位置的体格之和。
数据范围
对于20% 的数据,所有菜市位置和小T所在的位置在一条水平直线上。
对于另外 30%的数据,s=0 ,其中20% 的数据还满足n,m≤50
对于另外20% 的数据,p=1
**对于100%的数据,\(n,m\leq 300\)\(s \leq 10\)\(p \leq 15​**\)
样例输入1

4 5 3
0 1 1 1 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 4 1
0 0

样例输出

6 0

样例输入2

**4 6 3
1 1 1 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
0 4 1
3 0 **

样例输出

7 5

一条直线的那个点:

先走坐,再走右和先走右再走左看哪个短

体格:从最大体格开始减,看哪个体格刚好可以走完所有的菜店并且不碰到障碍

最短路:

旅行商问题

1569911886094

用二进制(状压dp)表示每个点经没经过,枚举每个点是由哪个点转移过来的(两点之间最小距离可以用bfs求)

\(f[s|1<<j][j]=f[s][i]+dis[i][j]\)

\(s∪1<<j由j转移过来\)

dp时可以用bfs求两点间距离

体格

设一个size[x] [y],表示由x到y的最大体积

当前点为x,若dis[x] [y] 和dis[x] [ty]相等,则比较size(x,y),size(x,ty),选择较大的那个size的ty作为当前所在点的前驱

T3

生日(birthday.cpp/1s/256M)
题目描述
9102 年,科学家在离太阳很远之外发现一颗恒星叫许愿星,许愿星有一个行星叫夏之
星,夏之星上的理化性质和地球相似,也存在大气层,适合人类居住。
夏之星的南山幼儿园内计划了许多场生日派对。
现在有 n 个小朋友,编号为 1~n。
每次生日派对校长会初选择[L,R]区间内的小朋友参加生日派对,再由老师决定在校长
选中的小朋友中挑选出部分小朋友分为两个集合,一个集合的小朋友上午参加派对,一个集
合的小朋友下午参加派对。
编号为 i 的孩子,初始想要礼物价格为 a[i],对应的礼物的花费会为 a[i]+1,其中 1
元为邮费。当上午参加的小朋友的礼物总花费和下午参加的小朋友礼物总花销不同时,就会
引起花销少一方的小朋友的家长的不满,从而收到他们的投诉。
每次派对老师要仔细挑选参加派对的小朋友,尽量避免投诉。现在方老师怀孕了,会休
假很长时间,拜托你来帮她代管她们班的小朋友。你不仅要负责划分好参加生日派对的小朋
友,还要负责采购礼物和调查礼物价格的浮动。
相信聪明的你一定能解决这个问题
输入格式
一行 3 个正整数,分别表示 n,m,v。分别表示有 n 个小朋友,开生日派对或礼物价格
变化总共 m 次,初始礼物价格上限 v。
之后一行 n 个整数,第 i 个整数表示初始第 i 个小朋友礼物的价格为 ai。
之后 m 行每行三个数,opt,l,r。
opt 为 1 表示举办一场生日派对,校长选择区间为[l,r]。你需在[l,r]内挑选两个非
空集合 X,Y,满足:
1、X 和 Y 没有交集,即同一个小朋友不能同时出现在 X 集合和 Y 集合
2、设集合 X 有一个小朋友为 x,则花费为 a[x] + 1,要求集合 X 总花费和集合 Y
元素的总花费相等。
如果能选择出这两个集合输出 Yes,如果不能输出 No。
opt 为 2 表示礼物价格有变动。区间为[l,r]的小朋友所对应的礼物价格从 a[x]变化为
a[x]a[x]a[x] % v,即区间立方模 v。
输出格式
设操作 1 有 c 次,输出 c 行,每行一个字符串 Yes 或 No 表示能否选出这两个集合
一行一个整数,即答案

样例太长了,所以没有样例qwq

1569922396387

60%:

每个小盆友可以放到x集合里,也可以放到y集合里,也可以不理这个小盆友(不选)

对于\(r-l+1\leq 7\)的数据,我们可以爆搜枚举

在这里我们将放进x集合里的元素的系数设为1,放进y集合里的元素的系数设为-1,然后不选的设为0,爆搜出是否有和为0的方案数

显然复杂度不会炸

那么考虑\(r-l+1 >7\)的区间长度

我们要找到两个集合x,y,使得\(\sum_{s\in x}{a[s]+1}=\sum_{k \in y}{a[k]+1}\)

先考虑x集合

每个元素只有选和不选两种方案,设区间长度为len,所以,会有\(2^{len}\)种集合,但考虑每个元素的大小不超过v,所以这个区间的和最多是v*len,

显然当len足够大的时候,\(2^{len}\geq v*len\),这个时候,至少有两个集合会对应到同一个值上去,我们就可以让这两个集合分别当集合x和集合y

手动解一下\(2^{len} \geq v*len,len\leq 14\),所以当询问的区间长度$\geq$14的时候,直接输出Yes即可

当区间长度<14的时候,怎么办呢?

我们在上面解决了当区间长度为7的问题,发现14=2*7,所以我们可以折半搜索

可以记录前半段搜出的每个值,然后看后半段是否能搜出前半段中任一值的相反数(还要考虑0,1,-1这三种系数)

就像酱紫:

假设我们要对 3 5 1 1 这一组数据进行操作

左半边的元素其实要考虑:3 5 -3 -5 0

当然了,折半搜索在其它bt的题目里还可以用map记录前半段搜出的每个值对应的状态,设题目要求前半段+后半段=t,在搜后半段的时候,每搜到一个t-前半段出现的值,

100%:

在线段树上搞区间修改

修改:暴力处理(下到最底层,然后合并)

因为tag叠着叠着就大了,所以要搞个类似快速幂(倍增)一样的东西来搞\(a[i]^x\)这类东西

posted @ 2019-10-01 20:04  千载煜  阅读(471)  评论(0编辑  收藏  举报