学习VFK大神推BZOJ,记录一下学习的东西

1004:

burnside:一个置换群的等价计数=(每个置换的置换后等价情况数)/置换总数,每个置换的置换后等价情况数就是置换后没变的数

模意义下的除法:可以使用乘法逆元解,bx mod p=1,x就是b模P的乘法逆元,呢么x≡1/b(mod p),呢么a/b≡ax(mod p),然后用扩展欧几里得求乘法逆元即可(就是解bx mod p=1,某年NOIPT1)

也可以用费马小定理,(a/b)%p=(a/b)%P * b^(p-1)%p=a%p * b^(p-2),然后用快速幂求

1005:

树的prufer编码:(注意这里是无根树)

每次删除树中度数为1且序号最小的节点,并在序列中添加与其相邻的节点的序号,直到树中有两个节点,手玩一组小数据很容易理解(逃

呢么任意一棵树都有唯一的长度为n-2的prufer编码,且度数为m的节点在编码中出现了m-1次

呢么就可以将编码还原回一棵树,从prufer编码的最前端开始扫描节点,设该节点序号为 u ,寻找不在prufer编码的最小序号且没有被标记的节点 v ,连接   u,v,并标记v,将u从prufer编码中删除。扫描下一节点。

这个东西可以用来解决一些给出度数的问题,比如此题

如果高精度除的结果一定是整数的话就没必要写,可以质因子分解,加减一下然后高精度乘

一个小技巧,scanf("%abd");表示输出一个b位的int,如果位数不够前面补a,这个在输出万进制高精度的时候比较好用

再说一遍高精度怎么输出BZOJ平推计划:从la到1输出,如果万进制就输出ans[la],然后从la-1到1输出,补零的个数等于膜的数的零的个数(比如万进制膜10000要补4个零)

1006:

做这题需要好好学一下cdq的弦图与区间图,勉强能理解吧,不懂cdq

首先有一个非常严重的问题,团数并不是团的个数,而是最大团的节点的个数!!!

在弦图中团数=色数,下面是NOIP吧的证明:

首先团数<=色数 应该可以吧...
因为最大团的点必然每一个点的颜色不同...
接下来由于最大势算法求出的 那个 完美消除序列的每一个点都满足它与它后面的相连的点构成一个团,由于这个性质,考虑 节点 i 的时候 ,i后面与它相连的点都必然 是相互连接的, 也就是说 i 后面与它相连的点也是一个团。
考虑那个染色算法...我们染到第i个点的时候,由于上面的性质,与i相连的点必然相互染的是不同的颜色,所以我们考虑色数实际上就是考虑每一个点与它的相连的点构成的团的最大团数即可,所以 团数>=色数。
所以 团数=色数

染色的时候从1开始枚举颜色,直到第i个颜色没有被周围的任何一个节点染色,这个节点的颜色就是i,然后维护最大的i,就是团数

msc求完美染色序列(peo为所求序列):

 1 void mcs(){
 2     for(int i=n;i;i--){
 3         int now=0;
 4         for(int j=1;j<=n;j++)//注意这个label最大的点并不是和i相邻的点,而是全局点
 5             if(label[j]>=label[now] && !visited[j])  now=j;
 6         visited[now]=true;
 7         peo[i]=now;
 8         for(int j=LINK[now];j;j=e[j].next)
 9             label[e[j].y]++;
10     }
11 }
View Code

相关文章:

  • 2022-01-17
  • 2021-11-28
  • 2021-05-24
  • 2021-10-23
  • 2021-07-12
  • 2021-12-12
猜你喜欢
  • 2021-06-28
  • 2021-07-04
  • 2021-12-26
  • 2022-12-23
  • 2021-10-15
  • 2021-11-26
相关资源
相似解决方案