ZR8.31
$$\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,然后慢慢搞就行了
# 溜了溜了