zoukankan      html  css  js  c++  java
  • bitset

    bitset

    CF113C Double Happiness

    把线性筛的mindiv替换为bitset

    #include <bitset>
    #include <cstdio>
    #include <cstring>
    #include <iostream>
    
    using namespace std;
    const int N=300000005;
    int n,l,r;
    int p[20000005];
    bitset<N>mindiv;
    
    signed main() {
    	scanf("%d%d",&l,&r);
    	for(int i=2;i<=r;i++) {
    		if(!mindiv[i]) mindiv[i]=1,p[++p[0]]=i;
    		for(int j=1;j<=p[0]&&1ll*i*p[j]<=N;j++) {
    			mindiv[i*p[j]]=1;
    			if(i%p[j]==0) break;
    		}
    	}
    	int ans=0;
    	for(int i=1;i<=p[0];i++) 
    		if(l<=p[i]&&p[i]<=r&&((p[i]-1)%4==0))
    			ans++;
    	if(l<=2&&2<=r) ans++;
    	printf("%d
    ",ans);
    	return 0;
    }
    
    
    

    BZOJ3687: 简单题(dp+bitset)

    求n个数子集算术和的异或和。

    设dp[i]表示由这n个数能有多少种方案组成i,显然这样dp[1~sum]就将所有的子集和统计完了,只要判断(dp[i]&1)就有ans^=i

    https://blog.csdn.net/Fsss_7/article/details/50822026

    #include<cstdio>
    #include<iostream>
    #include<bitset>
    #include<cstring>
    using namespace std;
    int N;
    bitset<2000001>bit;
    int main()
    {
        scanf("%d",&N);
        bit[0]=1;
        while(N--)
        {
            int x;
            scanf("%d",&x);
            bit^=bit<<x;
        }
        int ans=0;
        for(int i=2000000;i>=0;i--)
            if(bit[i]==1) 
                ans^=i;
        printf("%d",ans);
        return 0;
    }
    

    [BZOJ4484: Jsoi2015]最小表示

    #include <queue>
    #include <cstdio>
    #include <bitset>
    #include <cstring>
    #include <iostream>
    #include <algorithm>
    
    using namespace std;
    inline int read() {
    	int x=0,f=1;char ch=getchar();
    	while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    	while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
    	return f*x;
    }
    const int N=30005;
    const int M=100005;
    
    int n,m;
    bitset<N>G[N];//维护连通性
    int hd[N],to[M],nxt[M],tot;
    inline void add(int x,int y) {
    	to[++tot]=y;nxt[tot]=hd[x];hd[x]=tot;
    }
    
    int du[N];
    int out[N],tim[N],cnt;//出队元素,时间
    queue<int>q;
    void topo() {
    	for(int i=1;i<=n;i++)
    		if(!du[i]) q.push(i);
    	while(q.size()) {
    		int x=q.front();
    		q.pop();
    		out[++cnt]=x;tim[x]=cnt;
    		for(int i=hd[x];i;i=nxt[i]) 
    			if(!(--du[to[i]])) 
    				q.push(to[i]);
    	}
    }
    
    int st[N],tp;
    bool cmp(int a,int b) {
    	return tim[a]<tim[b];
    }
    int ans;
    int main() {
    	n=read();m=read();
    	for(int i=1,x,y;i<=m;i++) {
    		x=read();y=read();
    		add(x,y);du[y]++;
    	}
    	topo();
    	//正着无法知道连通性,所以倒序处理
    	for(int j=n;j;j--) {
    		int x=out[j];
    		G[x][x]=1;
    		tp=0;
    		for(int i=hd[x];i;i=nxt[i])
    			st[++tp]=to[i];
    		sort(st+1,st+1+tp,cmp);
    		for(int i=1;i<=tp;i++) {
    			if(G[x][st[i]]) ans++;
    			else G[x]|=G[st[i]];
    		}
    	}
    	printf("%d
    ",ans);
    	return 0;
    }
    

    联通数(传递闭包)

    #include <bitset>
    #include <cstdio>
    #include <cstring>
    #include <iostream>
    #include <algorithm>
    
    using namespace std;
    inline int read() {
    	int x=0,f=1;char ch=getchar();
    	while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    	while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
    	return f*x;
    }
    int n;
    bitset<2005>f[2005];
    char mp[2005];
    int main() {
    	n=read();
    	for(int i=1;i<=n;i++) {
    		scanf("%s",mp+1);
    		for(int j=1;j<=n;j++)
    			f[i][j]=mp[j]-'0';
    		f[i][i]=1;
    	}
    	for(int i=1;i<=n;i++) 
    		for(int j=1;j<=n;j++)
    			if(f[j][i])
    				f[j]|=f[i];
    	long long ans=0;
    	for(int i=1;i<=n;i++) 
    		ans+=f[i].count();
    	printf("%lld
    ",ans);
    	return 0;
    }
    
  • 相关阅读:
    oracle 锁查询
    ORACLE 本session产生的redo
    UML
    面向对象
    设计思维
    程序员习惯
    程序员修炼之道
    架构指南
    微服务架构
    测试用例
  • 原文地址:https://www.cnblogs.com/ke-xin/p/13873470.html
Copyright © 2011-2022 走看看