zoukankan      html  css  js  c++  java
  • 集合的整数表示

    【基本的集合操作】:

    (1) 空集Ø ------------------------------------------------------------> 0

    (2)只含有第 i 个元素的集合{ i } ----------------------------------> 1 << i

    (3)含有全部 n 个元素的集合{0, 1, ..., n-1} --------------> (1 << n) - 1

    (4)判断第 i 个元素是否属于集合 S ------------------------------> if (S >> i & 1)

    (5)向集合中加入第 i 个元素 S υ { i } ----------------------------> S | 1 << i

    (6)从集合中删去第 i 个元素 S { i } -----------------------------> S & ~ (1 << i)

    (7)集合 S 和 T 的并集 S υ T -------------------------------------> S | T

    (8)集合 S 和 T的交集 S ∩ T --------------------------------------> S & T


    枚举基和S={0,1,2...,n-1}中的所有子集都枚举出:

    for(int S=0;S<1<<n;S++){
        // 对子集的处理
    }
    

      

    【降序遍历子集】:

    int sub = sup;
    do{
    	sub = (sub - 1) & sup;
       }while(sub != sup);
    

      

    【枚举包含所有大小位k的子集】:

     while(comb < (1 << N))
     {
          int x = comb & -comb, y = comb + x;
          comb = (comb & ~y) / x >> 1 | y;
     }
    

      

    解析:

    x = comb & -comb 可以获取最低位的1
    y = comb + x 将最低位的连续1变成0,高一位变成1(新的1)
    comb & ~y 获取最初的连续的1区间
    (comb & ~y) / x >> 1 获得最初的连续1区间然后把最低的1移走维持1的数量不变且是新产生1中最小的。
    (comb & -y) / x >> 1 | y 状态更新。

    总的说完成的操作是:在最低位的连续1区间前一位产生一个1(最小),然后把这个区间一起右移直到少了一个1维持1的数量不变,且是按顺序枚举。

  • 相关阅读:
    PAT 甲级 1126 Eulerian Path (25 分)
    PAT 甲级 1126 Eulerian Path (25 分)
    PAT 甲级 1125 Chain the Ropes (25 分)
    PAT 甲级 1125 Chain the Ropes (25 分)
    PAT 甲级 1124 Raffle for Weibo Followers (20 分)
    PAT 甲级 1124 Raffle for Weibo Followers (20 分)
    PAT 甲级 1131 Subway Map (30 分)
    PAT 甲级 1131 Subway Map (30 分)
    AcWing 906. 区间分组 区间贪心
    AcWing 907. 区间覆盖 区间贪心
  • 原文地址:https://www.cnblogs.com/jaszzz/p/12849648.html
Copyright © 2011-2022 走看看