码迷,mamicode.com
首页 > 其他好文 > 详细

ZR8.31

时间:2019-09-03 22:01:09      阅读:89      评论:0      收藏:0      [点我收藏+]

标签:red   工作   添加   ``   分组   splay   miss   orb   一个   

\[\color{red}{木得题面木得题解木得代码}\]

\(\color{blue}{A}分组\)

\(首先先按照工作经验排序\)

\(如果经验相同,那么就按照想当组员,啥都想当,想当组长的顺序来排序\)

\(设f[n][a][b] 表示当前是第i个人,已经配好了a个,还有b个只有组员\)

那么,就有下面的方程

组长 : f[x][j][l] = min(f[y][j-1][l+1]+a[i].cost,f[x][j][l]) ;
组员 : f[x][j][l] = min(f[x][j][l],f[y][j][l-1]+a[i].cost) ;

最后答案就是 f[n][m][0]

代码
_______

\(\color{blue}{折纸}\)

你会发现横着折和竖着折是相互独立的,然后最后答案就是横着的方案数乘竖着的方案数

所以,我们可以吧折纸看作是裁纸,每次裁掉比较小的一个部分

剩下的有点小萌

代码

\(\color{green}{C 集合}\)

思路

建一棵字典树

然后这一棵字典树按照添加进去的数字的二进制从低位到高位储存

然后现在就是看这几个操作了

对于操作1和操作2,我们可以维护一个num数组来标记以i节点为终点的数字,来标记有几个这个数

至于添加一个数,直接添加就行了,删除同理

至于异或操作,我们就维护一个tag标记

至于加一操作,我们发现

对于二进制,加一后就只要找到最左边的一个0,然后这个0右面的所有1都变成0

然后我们是倒着存的,所以最后一个叶节点一定是0,然后想要加一存起来的话只要左右儿子互换就行了

也就是说,我们只要找到第一个0,然后慢慢搞就行了

代码

```

溜了溜了

ZR8.31

标签:red   工作   添加   ``   分组   splay   miss   orb   一个   

原文地址:https://www.cnblogs.com/lyt020321/p/11455636.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!