Gym 100345H Settling the Universe Up

bitset模板

bitset可以看作bool数组,但优化了空间复杂度和时间复杂度,并且可以像整形一样按位与或。

优化作用:

常常碰到处理的数组只有0和1的变化,此时就可以使用bitset优化。比如求两个集合的交集可以使用按位与运算,求并集可以使用按位或运算

#include<bitset>
biset<32> s(10);  //32位的bitset,赋值为十进制的10
bitset<32> bs("011010101001"); //用字符串初始化
bs[20]=1; //像数值一样对某一位进行操作

s=10; //赋值为十进制的10
s.reset();//清零
s.set(); //全部位置放置为1
s.count(); //统计1的个数

b.flip(); //把b中所有二进制位逐位取反
b.to_ulong();//用b中同样的二进制位返回一个unsigned long值

b1 = b2 ^ b3;//按位异或
b1 = ~b2;//按位补
b1 = b2 << 3;//移位

  

例题:

Gym 100345H

这是一个有向无环图,可以有拓扑序列

bitset<maxn> f[maxn]; // f[i]保存i的到达信息,其中f[i][j]表示i是否可以到达j

对于任意与i相连的点j,f[i]=f[i]|f[j],f[i][j]=1,更新信息,具体dfs实现,bitset实现压位

修改操作只有1000次,每一次重新建图即可,O(1000*n^2)

查询为O(1)

#include<bits/stdc++.h>

using namespace std;

const int maxn=210;
int n,m,k;
bool a[maxn][maxn],vis[maxn];
bitset<maxn> f[maxn];

void init()
{
    memset(a,0,sizeof(a));
    for (int i=1; i<=m; i++)
    {
        int u,v;
        scanf("%d%d",&u,&v);
        a[u][v]=true;
    }
}

void dfs(int x)
{
    if (vis[x]) return;
    vis[x]=true;
    for (int i=1; i<=n; i++)
        if (a[x][i])
        {
            dfs(i);
            f[x]|=f[i];//bitset
            f[x][i]=1;
        }
}

void build()
{
    memset(vis,0,sizeof(vis));
    for (int i=1; i<=n; i++) f[i].reset();
    for (int i=1; i<=n; i++)
        if (!vis[i]) dfs(i);
    int sum=0;
    for (int i=1; i<=n; i++)
        sum+=f[i].count();
    printf("%d\n",sum);
}

void work()
{
    build();
    scanf("%d",&k); getchar();
    for (int i=1; i<=k; i++)
    {
        char c,ha;
        int u,v;
        scanf("%c%d%d%c",&c,&u,&v,&ha);
        if (c==‘?‘)
        {
            if (f[u][v]) puts("YES"); else puts("NO");
        } else if (c==‘+‘)
        {
            a[u][v]=true;
            build();
        } else if (c==‘-‘)
        {
            a[u][v]=false;
            build();
        }
    }
}

int main()
{
    freopen("settling.in", "r", stdin);
    freopen("settling.out", "w", stdout);
    while(cin>>n>>m)
    {
        init();
        work();
    }
    fclose(stdin);
    fclose(stdout);
    return 0;
}

  

时间: 2024-09-30 14:07:52

Gym 100345H Settling the Universe Up的相关文章

Gym - 100345H Settling the Universe Up(bitset)

https://vjudge.net/problem/Gym-100345H 题意: 给出一个图,求图中u能到达v的对数,并且u<v.并且会有更新和查询操作. 思路: bitset直接暴力,对于每次更新操作之后,再重新计算一遍即可.bitset是真的强大啊! 1 #include<iostream> 2 #include<algorithm> 3 #include<cstring> 4 #include<cstdio> 5 #include<ve

Gym 100342J &amp; Gym 100345H (bitset在图论题的应用)

bitset bitset在某些常数优化以及状态保存方面被称之为神器并不为过,主要表现在以下几个方面: 1. 状态表示.试想,用一个数来表示状态的极限是64位,而bitset可以保存任意位二进制数,并且修改简单,统计方便,并且支持批量操作. 2. 常数优化.图论的题,尤其涉及不带权的邻接图,算法经常动辄 n2,n3 ,这个时候我们可以用n个bitset存储每个点的邻接情况,并进行相应位操作,来替代直接遍历图的操作,经常可以将总复杂度降低为原来的1/32甚至还要少! 3. 集合运算.交集按位与,并

CodeForces Gym 100935D Enormous Carpet 快速幂取模

Enormous Carpet Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Gym 100935D Description standard input/outputStatements Ameer is an upcoming and pretty talented problem solver who loves to solve problems using computers.

# 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释 deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial main restricted universe multiverse deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial main re

deb http://packages.linuxmint.com sonya main upstream import backport deb http://mirror.neu.edu.cn/ubuntu xenial main restricted universe multiversedeb http://mirror.neu.edu.cn/ubuntu xenial-updates main restricted universe multiversedeb http://mirro

B - Average Gym - 101161B 组合数学

http://codeforces.com/gym/101161/attachments 今天被卡常了,其实是自己对组合数技巧研究的不够. 如果是n, m <= 1e5的,然后取模是质数,那么可以用费马小定理. 如果n, m都比较小,那么其实是直接杨辉三角.不用逆元那些. 这题的思路是,枚举每一一个ave,然后总和就是n * ave 相当于方程  x1 + x2 + .... + xn = n * ave中,在0 <= x[i] <= full的情况下,不同解的个数中,使得x[i] ==

Codeforces Gym 100269 Dwarf Tower (最短路)

题目连接: http://codeforces.com/gym/100269/attachments Description Little Vasya is playing a new game named "Dwarf Tower". In this game there are n different items,which you can put on your dwarf character. Items are numbered from 1 to n. Vasya want

CodeForces Gym 101063C 二进制压缩

http://codeforces.com/gym/101063/problem/C 给n个人,m样物品,每个人可以从物品中选择几样.两人选择物品的交集元素个数比上并集元素个数如果大于某个比例即可将两人配对.求配对数. n的范围是1e5,直接比较所有人的选择会TLE,应该将所有选择物品的情况用二进制压缩,m最大是10,情况数目小于2048,可以接受.注意配对总数范围应为long long. #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> i

Gym 101246H ``North-East&#39;&#39;(LIS)

http://codeforces.com/gym/101246/problem/H 题意: 给出n个点的坐标,现在有一个乐队,他可以从任一点出发,但是只能往右上方走(包括右方和上方),要经过尽量多的点.输出它可能经过的点和一定会经过的点. 思路: 分析一下第一个案例,在坐标图上画出来,可以发现,他最多可以经过4个点,有两种方法可以走. 观察一下,就可以发现这道题目就是要我们求一个LIS. 首先,对输入数据排一下顺序,x小的排前,相等时则将y大的优先排前面. 用二分法求LIS,这样在d数组中就可

Gym 100712I Bahosain and Digits(开关翻转问题)

http://codeforces.com/gym/100712/attachments 题意: 给出一串数字,每次选择连续的k个数字加上任意数(超过10就取余),最后要使得所有数字都相等,求最大的k. 思路: 开关翻转问题. 算法具体可以参考<挑战程序竞赛>常用技巧篇. 这道题目就是在枚举k的同时再枚举一下最后要转换成的数字即可. 1 #include<iostream> 2 #include<algorithm> 3 #include<cstring>