魔法训练

来源:互联网 发布:淘宝usa商城卖假货? 编辑:程序博客网 时间:2024/04/30 04:35

前言:由于太无聊,所以开坑,目标是叉姐的魔法训练。ps:hust上 dafashi


初级魔法训练

传送门

1. p1:

  • 题意:给定n个集合,每个集合内有一些数字(可以重复)。给出q个询问,每次给出两个数x,y,问能否有一个集合同时包含x,y两个数。(n<=1000,q<=20w)
  • solution:trie树上应用bitset

2. p2:

  • 题意:有n个三元组(x,y,z),定义两个三元组之间的差为D=max(x1x2,y1y2,z1z2)min(x1x2,y1y2,z1z2),求所有pair的差之和。(n<=20w)
  • solution:设x=x1x2,y=y1y2,z=z1z2. 那么D=max(x,y,z)min(x,y,z),在数轴上画出这三个点,可以发现D=(|xy|+|xz|+|yz|)/2,再将绝对值里面的数打开,发现有规律,然后就OK了。
  • 闪光点:将maxmin转换一下(只适应3个点)

3. p3:

  • 只要观察到每列都是单调的就OK了

冰系魔法入门

传送门

p1

  • 题意:给定3个矩阵(a,b,c)c=ab,但是c里有可能有一个元素是错误的,要求找到这个元素。矩阵的维度<=1000
  • solution:显然O(n3)的矩阵乘法是不行的。首先判断错误元素出现在哪一行,这个可以O(n2)解决(将矩阵b每行元素结合成一个),然后再O(n2)判断是哪一列出现错误。
  • 闪光点:特殊情景特殊考虑,创造性的将矩阵b合并成1列。

p2

  • 题意:勇士战恶龙,有n回合,每一回合勇士有以下动作可供选择
    attack:对恶龙造成x点伤害
    defend:在这一回合无视恶龙的攻击
    heal:回复自己y点血量
    恶龙则是在回合i对勇士造成a[i]的伤害
    勇士初始血量:hp1 恶龙初始血量:hp2
    谁的血量<=0谁死亡,找到最优策略

  • 闪光点:时光倒流。

  • solution:假设我每次都攻击,如果当前回合要死了,我就取消前面某一回合的攻击,顺便回血。所以维护一个max(a[i],y)的优先队列。

p3

计算几何,待搞懂。

收获:优先队列贪心实现的时光倒流,类似的还有汽车加油问题,


火球术入门

传送门

p1

  • 题意:FJ有n种硬币,面值为a[i]的硬币数量有b[i]个,现在他要给员工发工资,每个月至少X元,只能多不能少,现在他想知道最多能给员工发多少月的工资。
  • solution:先用面值大的硬币凑成恰好少于X的面值,然后再用小的补上来。

p2

  • 题意:在一个二维区域,有一片连在一起的森林,其他地方全是草地(可以行走),主人公现在正在其中某一个草地上,现在他想从初始位置出发,围着森林绕一圈(也就是说路径包围森林),然后回到初始位置,问最短的路程。
  • solution:应用既然要包围,那么从森林的某一点向右边界连一条线,可以知道路径一定是经过这条线的,所以枚举这条线上的点,开始从非上非下bfs,两个加起来构成了一个围着森林的闭合路径。具体实现:bfs的时候特判当前点是否在上述直线上,如果在那么限制方向,否则的随意。
  • 闪光点:特殊的bfs,实在妙

风系魔法基本要领

传送门

p1:

  • 由于没有什么特别的闪光点,所以不写题解了。

p2:

  • 题意:经典的在河两岸修建桥的问题,只不过这次,某一岸的城市是10w数量级,另一个是2K数量级。
  • solution:首先O(nm)数量级的dp方程很容易写出,dp[i][j]=min(dp[i1][j],dp[i1][j1]+abs(x[i]y[j])),然后优化一下,把m优化成2n,也就是对电脑来说,在服务器位置前n个和后n个。然后复杂度就是O(n2)了.

p3:

  • 题意:一个长度为n的序列,给出询问[L,R],我们要找到最长连续子序列使得这个子序列里面的元素全都不相同。
  • solution:首先一个dp预处理出所有元素向左延伸的最大范围,也就是在这个范围里没有重复元素。然后查询[L,R]的时候,如果能延伸的最左端>=L的时候,可以直接RMQ查询,唯一麻烦的就是最左端<L的情况,但是观察一下,dp数组是单调的,所以我们可以二分找到>=L的下标,分两种情况讨论。
  • 闪光点:单调和RMQ的巧妙结合。

我是如何成为一名合格的小学生的?

传送门

p1:

  • 题意:有n个元素,每个元素可以属于集合A,也可以属于集合B,当属于集合A的时候,他的值是a[i],当属于集合B的时候,他的值是b[i],找到一种划分方案使得max(A)+max(B)最小。
  • solution:先将n个元素按a的值大小排序,然后枚举n次,注意预处理处从后往前b值得最大值。因为我枚举第一维的时候,因为左端的a值都小于当前的a值,所以如果左端取得话,对A的最大值没有影响,但是如果不取的话,有可能增加B的最大值,所以我默认全部都取。

p2:

  • 题意:有一个4n的板,现在要将他的每一格涂某些颜色,对于格子(x,y),其颜色为Ax,y,那么必须满足Ax,y>=Ax,y1,也就是同一行,后一格颜色大于等于前一格。除此之外,还会给出一些限制条件,Ax1,y1==Ax2,y2
  • solution:首先观察1n的板,我们用dp[i][j]表示第i个格子用颜色j所能产生的方案数。dp[i][j]=jk=1dp[i1][k],我们将这个方程转换一下(用另一种形式表示),我们将dp的第二维消掉
for(int i=0;i<=255;i++)//遍历颜色{    for(int j=0;j<=n;j++)    {        if(j+1>n)            continue;        dp[j+1]+=dp[j];//dp[j]表示格子j的颜色<=i的方案数    }}

如果这样表示dp方程的话,同样可以适用于4维的,用dp[i][j][k][w]表示小于等于当前颜色的所有方案,注意,有点像扫描线。需要预处理出所有不能放的位置,也就是题目中的限制条件。似乎说不清.代码.


暴雨术入门

传送门

p2

  • 题意:给你一些面值,每种面值只能用一次,问最小的不能组合出来的面额(正整数)。
  • solution:咋一看有点像博弈里面的mex,但是题目给的范围并不能用dp搞出来。我们将面值排下序,假如我们当前已经可以拼出[1,limit]范围的所有数值,假如当前处理的面值为x,假如x>limit+1,那么limit+1永远也不可能被拼出来,否则的话更新limit=limit+x

p3

  • 题意:有一个数列A,初始都是0,每次进行以下操作,(L,R,c),表示对于区间[L,R]里每个数,如果小于P,那么A[i]+=c,否则的话,A[i]+=2c.
  • solution:这个题网上流传一种线段树的写法,估计是以前数据太水了,现在加强数据了,只要是用线段树写的都过不了。正解是用树状数组维护时间,对于操作(L,R,c),在L处添加一个事件(c,time)表示在time时间加个c,在R+1处添加一个事件(c,time)表示在time时间减个c,然后i1n遍历,首先把所有事件处理完,然后二分时间,找到最小的时间,使得在这个时间之前加的数已经使得A[i]大于等于P,找到这个就好办了,剩下的时间乘以两倍就可以了。
  • 实在妙
0 0
原创粉丝点击