寒武纪camp网络测试赛

地址:oj点我进入

A(树形dp+树链剖分)

题意:

分析:

  考虑树形dp,f0(x)和f1(x)分别表示以x为根的子树,不取x点或取x点的最大合法子集的元素个数

  那么对于一个询问来说,答案就是max(f0(x),f1(x)),我们的任务就是对于每次修改操作维护所有f数组的变化

  假设我们新加入了一个x节点,很明显只有x以及x的祖先们的f值会改变

  首先f1(x)=f0(x)+1,因为我多取一个x节点一定是合法的(题目保证权值从小到大)

  然后考虑x的祖先fa,应该有f0(fa)=f0(fa)+1,因为fa的子树里面可以多选一个点x

  但问题是x的某个祖先fa可能f0值不会变,因为它的最优决策可能是某个f1(y),其中dep(fa)<dep(y)<dep(x) 且三个在一条链上,所以y及y以上部分的f值都不会改变

  那么什么时候会出现这种情况呢,其实就是f1(y)>=f0(y)+1这时候,因为这时候我选择“放y这个点”不比“不放y这个点且放刚进入的x点”

  于是我们想到了很自然的维护方法,对于每次新来的点x,一直向上跳,跳到第一个f1(y)>=f0(y)+1的位置停止,将father(x)~y这一段的点的f0全部加上1

  那当然这样会TLE,我们只能用数据结构来维护这样的事

  在树上给一条链加上1这件事很自然可以想到用树链剖分+线段树去做,问题是如何找到最近的那个f1(y)>=f0(y)+1的点

  我们发现这样的y只可能是目前的所有C操作里面的所有点,即目前有赋权值的点,而不是其它的未赋权值的点,换句话说我们的给一段点的f0全部加上1这样的操作不会在加的过程中产生新的y,也就是说加1操作和维护这样的y是独立的

  于是我们可以把所有的f1(y)>=f0(y)+1打个标记,对于每个新加入的x,我们在树上找到离x最近的带标记的祖先y,然后将这一段+1,同时将y的标记消除(因为y已经变成了f1(y)=f0(y)了)

  那么怎么找最近的带标记的祖先y呢,我们可以顺着重链向上跳,然后每次在线段树上找最靠右边的标记节点,这样是O(logn * logn)的

  所以总的时间复杂度就是$O(nlog^2n)$的

B(最短路)

题意:

分析:

  很显然d[i][j]表示走到i点,前面的gcd为j情况下的最短路,那么跑便最短路就可以求得S到T的最短路

  但现在有多个S,T固定是n,很显然我们将我们建的这个图反向,以n点为S跑最短路就行了

  时间复杂度$O(500n log (500n))$

C(数学)

题意:

分析:

  容易推导成$a=(b+1)*[a/b]$

  即$a/(b+1) = [a/b]$

  如果枚举a的话我们能发现b+1是a的因数并且b+1在sqrt(a)的右侧

  于是我们想到基本上就是a的因数个数/2

  于是统计1~n的因数个数和然后除以2,这里直接sqrt(n)复杂度就做完了

  找找几个特殊情况,即i*i类型的数和i*(i+1)类型的数,把减掉就行了

D(Trie树/二分答案+hash)

题意:

分析:

  如果不存在循环这个问题,那可以把所有串丢到一个Trie树里面,然后就能很方便的找到最长前缀了

  现在有循环,易得循环次数最多是lcm,即可以把每个串复制500遍,但规模太大了

  题解给出了一个结论,就是两个串的最大公共前缀不会超过a+b-gcd(a,b)

  所以只需要把每个串扩充到长度为1000就行了

  当然也可以二分答案,易得答案上限是500*500,我们去二分一个mid

  将每个串前mid个字符对应的hash值可以快速的求出来,然后把所有串的hash值排个序就能知道是否有两个相同的了

E(树形DP)

题意:

分析:

  最简单的想法预处理所有的lca,对每个询问暴力枚举点n,这样是3e8的,会TLE

  考虑预处理出dp[k][u][j]表示在模k意义下,是否有到点u的距离为j的点

  很明显这个要用树形dp跑

  用树形dp很容易跑出一个点u到其子树的情况,但还要考虑父亲节点的情况

  我们再维护一个up[k][u][j]来表示k点子树外面的情况

  我们在第二次树形dp的过程中去维护点u每个孩子v的up,很明显up[v]可以直接继承up[u],但麻烦的是孩子之间的关系

  我们可以先从左到右合并每个孩子的dp值,就能更新每个孩子左边的孩子对其影响

  再从右到左合并每个孩子的dp值,就能更新每个孩子右边的孩子对其影响

  这个可以作为树形dp的一个通用套路

  时间复杂度O(n*k*k+Q)

F(树链剖分+线段树)

题意:

分析:

  直接去维护所有点对的值无法搞

  我们可以换个角度去思考边的情况,对于每个2操作对应的边e,所有点对对于e而言只有过e和不过e两种

  不过e的点对的答案还是原来的,过了e的点对答案变成了ans-w[e]+v,我们只需要对于每条边都维护这样两种(过和不过)情况对应的最大值,最后再比较一下哪种情况值更大就行了

  很明显可以用树链剖分来搞,设f[0]表示过该边点对的最大值,f[1]表示不过该边的点对最大值

  那么对于一个1操作(x,y),我们先求出他们的距离w,然后用树链剖分将对应路径上区间的f0都和w取max,对于除去这些区间之外的区间(易得也是log个)的f1都和w取max

  注意这里的线段树是“修改操作为区间对一个数取max”“查询操作是查询一个点的最大值”,我们并不需要标记回收线段树,我们只需要给对应区间打标记,不用pushdown,最后query的时候把路过的所有tag取个最大值就行了,很方便

  于是就做完了,时间复杂度$O(mlog^2n)$

  注意细节,就是f0线段树的标记初值是inf(因为刚开始没有任何点对)

  还有就是处理边权的树链剖分时候一定要注意当跳到最高处的时候,lca的点权不能要

寒武纪camp网络测试赛的更多相关文章

  1. 寒武纪camp Day6

    补题进度:10/10 A(树形dp) 略 B(dp) 题意: 给出一个n个关键节点的机械手臂,最开始是竖直的,即关键点在二维平面上的坐标分别是(0,0) (0,100) (0,200) (0,300) ...

  2. 寒武纪camp Day5

    补题进度:6/10 A(状压dp) 题意: 有n个数字1,2,...,n,有m个限制(a,b),表示至少要有一个数字a排在数字b的前面 你需要构造出一个含有数字1~n的序列,数字可以重复多次,要求该序 ...

  3. 寒武纪camp Day4

    补题进度:7/11 A(博弈论) 略 B 待填坑 C(贪心) 题意: 一个序列是good的当且仅当相邻两个数字不相同.给出一个长度为n的数列,每个数字是ai.定义一种操作就是把a中某个元素拿到首位去, ...

  4. 寒武纪camp Day3

    补题进度:9/10 A(多项式) 题意: 在一个长度为n=262144的环上,一个人站在0点上,每一秒钟有$\frac{1}{2}$的概率待在原地不动,有$\frac{1}{4}$的概率向前走一步,有 ...

  5. 寒武纪camp Day2

    补题进度:8/10 A(计数+BIT) 题意: 给一个长度为n的数组a[],任意选0<=i<=j<n,将a[i]~a[j]从小到大排序,形成新的数组.问有多少个不同的新数组. N,a ...

  6. 寒武纪camp Day1

    补题进度:8/10 A(组合计数) 题意: 一个人站在数轴原点,每秒有1/4概率向前走一步,1/4概率向后走一步,1/2概率不动,问t秒后在p位置的概率. t,p<=100000 分析: 枚举不 ...

  7. 2017 湖南省赛 K Football Training Camp

    2017 湖南省赛 K Football Training Camp 题意: 在一次足球联合训练中一共有\(n\)支队伍相互进行了若干场比赛. 对于每场比赛,赢了的队伍得3分,输了的队伍不得分,如果为 ...

  8. 2014北邮新生归来赛解题报告a-c

    <span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255) ...

  9. 秦皇岛winter camp 总结

    冬令营在秦皇岛自闭了七天,很多题目看了都没有思路,或者是不知道怎么敲代码.我发现图论的题,自己连怎么建树都给忘了,想了半天.还有很多自己从未接触过的算法.在说说课堂上课的情况,大部分时间都是全程懵逼的 ...

随机推荐

  1. Vue的 $parent,并不能准确找到上一层的控件,所以如果需要,需要填坑这个 bug,递归寻找下上级

    Vue的 $parent,并不能准确找到上一层的控件,所以如果需要,需要填坑这个 bug,递归寻找下上级 // Find components upward function findComponen ...

  2. 【搜索】P1219 八皇后

    题目描述 检查一个如下的6 x 6的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行.每列有且只有一个,每条对角线(包括两条主对角线的所有平行线)上至多有一个棋子. 上面的布局可以用序列2 4 6 1 3 ...

  3. Windows下使用ffmpeg与java实现截取视频缩略图

    [ffmpeg.exe可执行文件获取]: 网上搜索后得到编译好的ffmpeg文件,下载地址:http://download.csdn.net/source/453719 [安装]: 将下载的文件解压, ...

  4. Java 编程下 Eclipse/myeclipse 如何设置单行代码显示的最大宽度

    http://www.cnblogs.com/sunzn/archive/2013/03/30/2990191.html 或 http://zhidao.baidu.com/link?url=67uy ...

  5. 在ios中使用FMDB

    SQLite (http://www.sqlite.org/docs.html) 是一个轻量级的关系数据库.iOS SDK很早就支持了SQLite,在使用时,只需要加入 libsqlite3.dyli ...

  6. 【2018 CCPC网络赛】1003 - 费马小定理

    题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=6440 这题主要是理解题意: 题意:定义一个加法和乘法,使得 (m+n)p = mp+np; 其中给定 ...

  7. Windows环境下安装 mysql-8.0.11-winx64 遇到的问题解决办法

    下载mysql安装包,我的是下载mysql-8.0.11-winx64,解压到你想安装的目录下,然后配置环境(window环境下,mac本还没试过), 1.首先,配置环境:右击此电脑->属性-& ...

  8. 自定义ngCloak

    场景: 一个非常复杂的表单页面,页面有5个标签,第五个标签中又有5个标签,也就是说一共有9个标签,每个标签中都有一个表单,表单之间相互关联.所有表单项(包括复合的),有80多个数据.全部东西写在一个h ...

  9. 如何用纯 CSS 创作一个荧光脉冲 loader 特效

    效果预览 在线演示 按下右侧的"点击预览"按钮在当前页面预览,点击链接全屏预览. https://codepen.io/zhang-ou/pen/erRzzR 可交互视频教程 此视 ...

  10. 「问题思考」python的递归中return返回none

    代码: #求最大公约数 def gcd(x,y): if x < y: swap = x x = y y = swap if x%y == 0: return y else: gcd(y,x%y ...