2018/3/13

  没有题解的考试

  标程1k我却只能改5k+的改法

T1 simple

  我好像遇到最长上升子序列的题就做不出来,上回在成都就是一道非常显然的上升子序列的部分分,然而我就是没有看出来,这次又是,开始一个小时,根本没有什么正经的思路,一直在搞什么逆序对,发现了一堆奇奇怪怪的性质,但是没什么卵用,直到我把别的题的暴力都敲完了,回来一看,才猛然发现链的情况是最长上升子序列,并且可以拓展到树上进行DP,然后搞到了40分,然后链的情况我还觉得可能是根有两个儿子,就算是这样,也是这敲一下啊,反正又不难打,然后40分的暴力,因为最后离散后没有把权值的最大值给改过来,又丢掉了20分。。。。。 感觉这是考试以来,做得最不爽的一道题

  但是我们的大猩猩现场就A了,他的做法就是把DP的过程优化成在线段树上搞,可以发现,在原来的f数组中,有实际贡献,也就是实际存在的j就是这可子树里存在过的权值,那么我们可以直接对于每一个节点开一个权值线段树,对应的权值就是原来f数组中的值,但是合并儿子的时候,并不能让对应节点简单的相加,因为两个儿子中,不同的j也会有产生更优的贡献,比如说,1号儿子有一个4的小根堆,那么他完全可以直接的加到2号儿子的3的小根堆中,所以我们考虑一个点,会对另一个子树中的哪些点产生贡献,首先,如果j<k并且f[i][j]<f[i][k],那么k就会比j更优,所以j对另一颗子树里的贡献会被j所覆盖,所以在线段树里维护一下然f是单调递减就好了,然后在合并的时候采用启发式合并,把小的线段树直接拍成一个数组,然后就先查一下每一个点在大线段树中的后继,因为这个别的子树中对他的最优贡献(单调性)那么记录一下这个值,这个是这个点被别的子树更新过的结果,然后在对大线段树中他能贡献的点区间加一发,就完成了儿子之间的合并,因为每一个儿子的线段树都是单调的,所以儿子合并之后依然是单调的,然后考虑加入当前的根的贡献,就是从所有儿子合成的大线段树中,查他的后继,然后+1就是这个根的最优贡献,但是由于这个根的+1操作,在把他插入到线段树中的时候,就可能造成线段树的不单调,就不断的查他的前驱,比他小就删掉,这样因为每一个点最多会被删掉一次,所以复杂度也是有保证的,然后这么搞下去就好了。。。。

  然后线段树里查前驱后继的话,如果要查x的后继,就先走到x所在的位置,然后在递归回来的时候,判断右儿子是不是空,回来第一个不是空的右儿子就是后继。

  正解的话就更NB了一些,我们想,如果两棵线段树里存的值不进行区间加,查后继更新这种操作的话,那么一个点的f值实际上就是他所在线段树的后缀和,那我们直接用一个 map 来实现存储每一个点自己不更新的值,然后启发式合并一发,最后遍历一下 map 第一个点的后缀和就是答案了,那么我们考虑一下map中每一个点的值的新含义,实际上就是它所代表的小根堆比他后继所代表的小根堆中的点数多了多少,但是还有一个没有解决的问题就是当把根这个点插入的时候,如何维护单调性,其实跟这个点的值直接++就好了,因为它比他后面的堆中多了一个点,但是这个根所在的点不能对它前面的点做出贡献因为他是堆顶,但是由于我们维护的是一个后缀和,每一个点实际上就是上一个办法中的线段树中的每一个点与相邻点的差分值,所以需要把他的前驱的值-- 来抵消掉它造成的影响,当他的前驱-- 之后变成了0那么就意味着,这个点的前驱所代表的小根堆中的点和这个点的小根堆的点数是一样的,那么前驱就不优了删掉就好了。

T2 trans

  这个题的话,模拟一下就是把每一个区间长度从小到大取max之后形成的新序列,有一个30分的部分分就是先考虑较小的那个数所存在的总区间长度,然后算出他的贡献然后在用大的算整个区间的在减去小,在考虑一下首尾的特殊情况的就好了。。。。 正解也是类似的,就是把所有的点排序之后,从小到大,分为黑白两种点,已插入的是白点,未插入的是黑点,然后在计算贡献的时候,就是这一步所有区间的贡献减去上一回的贡献,这么搞下去,然后也是注意一下不叫恶心的首尾情况。。 区间合并的话可以用链表,也可以用set

T3 mov

  50分的暴力还是很好拿的,正解就是小魔术就用卢卡斯,就是把每一个先有步转换,把(x,y)变成((x+y)/2,(x-y)/2),这样的话原来的移动对应到现在就是(x+1,y),(x,y+1),(x+1,y+1),然后设斜着走i步,A=(n+m)/2,B=(n-m)/2,那么方案数就是C(A+B-i,A)*C(A,i),然后我们就把C上的四个数都变成P进制,然后数位DP,转移求乘积就好了,但是值得注意的就是,如果(A+B)%p-i小于零了,那么我们就是要从更高的位上借一位,然后DP的f数组多开一位记录一下借位的情况就行了

 

  总结一下就是T1的懵逼导致后面的题做起来有些心理阻碍,做起来就没有那种顺畅的感觉,然后T1看出来是lis之后,打完想到了T2暴力之后也没有什么时间敲了,感觉最后一个小时直接就浪费掉了,T1的影响还是太大了,而且lis也并不难想么,逆序对想不出来完全可以换一种思路么。。。。。。。。。。。。

  T1还是挺令人印象深刻的。。。。。。。。。。。。

转载于:https://www.cnblogs.com/FOXYY/p/8569536.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
安装Vivado 2018.3的步骤如下所示: 1. 首先,下载安装包,并在没有中文的路径下解压缩。注意,在解压之前最好关闭电脑的杀毒软件,以防止某些文件被拦截或删除。 2. 解压缩完成后,打开文件夹,并双击最底部的安装应用程序。 3. 在欢迎界面点击"Next",然后勾选三个"I Agree",再次点击"Next"。 4. 在版本选择这里,勾选第三项"Vivado HL System Edition",然后点击"Next"。 5. 根据需求,取消勾选几项暂时用不到的选项,以减少磁盘空间占用。 6. 选择软件安装路径,建议选择除C盘以外的其他盘符,并确保路径不含有中文和特殊符号。 7. 点击"Install"开始安装,然后等待安装完成。安装时间的长短取决于电脑性能。 8. 在安装过程中,断开USB下载器的连接(如果有的话)。 9. 在安装过程中,可能会弹出一些对话框,如与Matlab相关的对话框。根据情况点击取消或确定。 10. 安装完成后,打开Vivado软件。但是请注意,如果没有license,只能免费使用30天。 11. 获取license的步骤可以参考文章"vivado2018.3安装注册指南",下载并解压保存license文件到某个文件夹下。 12. 在Vivado软件中,点击"Load License",选择"Copy License",然后选择刚才下载license的路径,安装license。 13. 点击"View License Status"查看license的状态,如果显示为"Bought",表示license已生效。 14. 至此,Vivado 2018.3的安装就完全结束了,现在可以打开软件并开始使用了。 请注意,以上是Vivado 2018.3的安装步骤。具体安装过程中可能会有一些细节和不同的操作,您可以参考文章中的视频教程或其他教程进行安装。 参考文章: vivado2018.3安装注册指南 正点原子提供的安装教程 编译库的存放位置设置在Vivado2018的安装目录下的Modelsim_Vivado_Lib文件夹中。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Vivado 2018.3 安装步骤及 license 获取](https://blog.csdn.net/weixin_42570192/article/details/127471922)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [Vivado:【1】Vivado 2018.3 配置ModelSim仿真](https://blog.csdn.net/Alex497259/article/details/130019331)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值