bitset

bitset就像一个bool类型(0/1)的数组一样,但是有空间优化——bitset中的一个元素一般只占1 bit,相当于一个char元素所占空间的八分之一。

同时速度快,另外可以减少运算。如交集(and),并集(or),<< | 等,速度变为原来1/32(之前是每个int处理一次,1 bitset stores the information of 32 int)。

    bitset<10> b;///init 0
    b.set();    ///all is 1
    b.reset();  ///all is 0

    b.set(0,1); ///pos,value
    b.set(2,1);
    cout<<b<<endl;  ///0000000101 (0-9 从右到左 ; 左边是最高位)
    cout<<b.count()<<endl;///1的个数 2

    string str=b.to_string();///转为字符串 0001000001
    cout<<str<<endl;

    string s="10010";
    bitset<5> c(s); ///s is a string
    cout<<c<<endl;  ///10010

寻找所有1

for (i=tmp._Find_first();i<n;i=tmp._Find_next(i))

 

1513 小Hi的烦恼

注意空间

 1 #include <cstdio>
 2 #include <cstdlib>
 3 #include <cmath>
 4 #include <cstring>
 5 #include <string>
 6 #include <algorithm>
 7 #include <set>
 8 #include <map>
 9 #include <queue>
10 #include <iostream>
11 #include <bitset>
12 using namespace std;
13 
14 #define ll long long
15 
16 const int maxn=3e4+10;
17 const int inf=1e9;
18 const double eps=1e-8;
19 
20 /*
21 二维:树状数组
22 k维:cdq分治 n^(k-1)*log(n)
23 bitset:n^k/32
24 */
25 
26 ///如何实现动态初始化
27 bitset<maxn> a[maxn],t,tt;
28 struct node
29 {
30     int x,y;
31     bool operator<(const node &b) const
32     {
33         return x>b.x;
34     }
35 }f[5][maxn];
36 
37 int main()
38 {
39     int n,i,j,k;
40     scanf("%d",&n);
41 //    for (i=0;i<n;i++)
42 //        a[i].set();
43     for (i=0;i<n;i++)
44         for (j=0;j<5;j++)
45         {
46             scanf("%d",&f[j][i].x);
47             f[j][i].y=i;
48         }
49 
50     ///也可以用string初始化,会快一点
51     for (i=0;i<n;i++)
52         tt.set(i,1);
53     for (j=0;j<5;j++)
54     {
55         sort(f[j],f[j]+n);
56 //        t.set();
57         t=tt;
58         for (i=0;i<n;i++)
59         {
60             k=f[j][i].y;
61             t.set(k,0);
62 //            a[k]&=t;
63             if (j==0)
64                 a[k]=t;
65             else
66                 a[k]&=t;
67         }
68     }
69     for (i=0;i<n;i++)
70         printf("%d\n",a[i].count());
71     ///其实也可以 a[k]|=not(t),再用n-a[i].count(),这样可以避免全1的初始化
72     return 0;
73 }
74 /*
75 
76 */

 

 
posted @ 2019-04-16 16:52  congmingyige  阅读(279)  评论(0编辑  收藏  举报