首页 > 代码库 > Codeforces Round #383(div 2)

Codeforces Round #383(div 2)

A、快速幂

B、 题意:求ai^aj=x的数对个数,x和a[]给定

  分析:a^b=c,则a^c=b,所以求ai^x=aj的个数,枚举一遍即可

C、 题意:给你一个有向图,每个点的出边只有一条,求最小的n,使得从任意点走2n步都可以走回原点

  分析:先判断是否存在,如果存在,那么图中肯定是一个个的简单环,所以每个点的入度和出度都为1,否则不存在

     对于存在的情况,遍历每个环,得出它们的长度,求出它们长度的最小公倍数lcm

     若lcm是偶数,那么ans=lcm/2,如果lcm是奇数,那么ans=lcm

D、 题意:n件物品,背包容量m的01背包,给出物品间的关系图,同一个连通块内的物品,要么选任意一个,要么不选,要么全选,求最大价值。

  分析:先介绍下分组背包,分组背包就是在01背包的基础上,规定一些组别,每一组里的物品要么不选,要么只能选一个

     for(int k=1;k<=p;++k)//枚举组别

      for(int j=m;j>=0;--j)//枚举包的容量

        for(int i=1;i<=n[k];++i)//枚举k组里的所有物品

          f[j]=max(f[j],f[j-w[i]]+v[i])

     这样改变枚举物品的顺序,巧妙的做到了每一组里面最多只选一个物品

     此题相较于分组背包而言,多了一个“要么全选”,这其实就是在该组中多加一个物品,该物品的重量和价值是该组物品的重量和价值总和

E、 题意:n对情侣(2n个人)坐成一个圈,给每个人数字1或数字2,要求每对情侣间数字必须不同、任意三个连续的人不能相同数字,问是否存在方案,如果存在输出任意一种。

  分析:先考虑的是2-SAT问题,但是仔细一想发现这里涉及到三个人,所以是3-SAT问题,这是个NPC问题……

     然后考虑类似的能不能用差分约束表示,结果发现难点还是在于三个人等价于三个变量……差分约束的边没法建

     最后参考了题解,很巧妙

     假设方案存在,将2i和2i-1连边、每对情侣连边,那么易得这个图里如果存在环必然是偶环,不存在奇环,它是个二分图

     核对下题意,这样建图,任意三个连续的点,必然有一个点和另外两个点不在二分图的同一边,就满足颜色不能都相同!

     所以先染色判断是否二分图,如果是二分图,将二分图的左边令为1,右边令为2就行了

Codeforces Round #383(div 2)