2017 四川省赛 D. Dynamic Graph

传送门



题意:n个点,m个相连边,q是询问次数。每次输入一个数代表把这个点涂黑,问每次整个图有多少白点。 黑点也可以涂白。

#include <cstdio>
#include <cmath>
#include <iostream>
#include <algorithm>
#include <vector>
#include <stack>
#include <cstring>
#include <queue>
#include <set>
#include <string>
#include <map>
#include <climits>
#define PI acos(-1)
using namespace std;
typedef long long ll;
typedef double db;
const int maxn = 3e2 + 5;
const int mod = 1e9 + 7;
const int INF = 1e8 + 5;
const ll inf = 1e18 + 5;
const db eps = 1e-5;

int n, m, q, pos[maxn], du[maxn];
vector<int> G[maxn], fa[maxn];

void init()
{
        for (int i = 1; i <= n; i++) G[i].clear(), fa[i].clear();
        memset(du, 0, sizeof(du));
}

int get(int x)
{
        return x == 0 ? 0 : (get(x>>1) + (x & 1));//每一位是否选中
}

void solve()
{
        while (cin >> n >> m >> q)
        {
                init();
                for (int i = 1; i <= m; i++)
                {
                        int u, v; scanf("%d%d", &u, &v);
                        G[u].push_back(v);
                        fa[v].push_back(u);
                        du[v]++;
                }
                for (int i = 1; i <= n; i++)
                {
                        for (int j = 1; j <= n; j++)
                        {
                                if (du[j] == 0)
                                {
                                        du[j]--;
                                        pos[i] = j;//拓扑排序存下连接点
                                        for (int k = 0; k < G[j].size(); k++)
                                                du[G[j][k]]--;
                                        break;
                                }
                        }
                }
                int vis[maxn] = {0};
                while (q--)
                {
                        int x; scanf("%d", &x);
                        vis[x] ^= 1;//是否涂黑
                        int dp[maxn][11] = {0};
                        for (int i = 1; i <= n; i++)
                        {
                                int h = pos[i];
                                if (vis[h] == 1)
                                {
                                        for (int j = 0; j < 10; j++)
                                                dp[h][j] = 0;
                                        continue;
                                }
                                int xx = (h - 1) / 30;//1-30 31-60 61-90
                                int hh = h % 30;//把300压到10  bit优化
                                dp[h][xx] |= (1 << hh);
                                for (int j = 0; j < fa[h].size(); j++)
                                {
                                        int tmp = fa[h][j];
                                        for (int k = 0; k < 10; k++)
                                                dp[h][k] |= dp[tmp][k];//是否联通
                                }
                        }
                        int ans = 0;
                        for (int i = 1; i <= n; i++)
                        {
                                int tmp = 0;
                                for (int j = 0; j < 10; j++)
                                {
                                        tmp += get(dp[i][j]);
                                }
                                if (tmp) ans += tmp - 1;
                        }
                        cout << ans << endl;
                }
        }
}

int main()
{
    int t = 1, cas = 1;
   // freopen("in.txt", "r", stdin);
   // freopen("out.txt", "w", stdout);
   // init();
   // scanf("%d", &t);
    while(t--)
    {
       // printf("Case %d: ", cas++);
        solve();
    }
    return 0;
}




Unity Engine AssetGraph 是一款 Unity 引擎的插件,可以帮助开发者自动化创建工作流程,从而快速、高效地处理大量的资源文件和构建项目。下面是 UnityEngine.AssetGraph 的使用教程: 1. 下载和安装 AssetGraph 插件 在 Unity Asset Store 中搜索 UnityEngine.AssetGraph 并下载该插件,然后将其导入到你的 Unity 项目中。 2. 创建 AssetGraph 在 Unity 编辑器中,选择 Assets -> Create -> AssetGraph,将创建一个新的 AssetGraph 资源文件。你可以将其命名为任何你想要的名称。 3. 添加节点 AssetGraph 主要由节点组成,每个节点代表一个操作,如将资源文件导入到项目中、复制或移动文件、压缩文件、转换文件格式等。你可以通过在 AssetGraph 界面拖动和放置节点来创建工作流程。 4. 连接节点 连接节点意味着将一个节点的输出连接到另一个节点的输入。这样,当一个节点完成操作后,它的输出将自动传递给下一个节点进行处理。 5. 设置节点参数 对于每个节点,你需要设置一些参数来指定它的操作。例如,你可以指定要导入的文件路径、要转换的文件格式、要复制/移动的文件路径等。 6. 运行 AssetGraph 设置好 AssetGraph 后,你可以单击 AssetGraph 界面中的“Build”按钮运行它。这将启动工作流程,并自动按照节点之间的连接顺序来处理资源文件。 7. 查看输出 完成 AssetGraph 运行后,你可以在输出文件夹中查看结果。其中包括已导入、复制、移动、转换或压缩的资源文件。 以上就是使用 UnityEngine.AssetGraph 的基本步骤。通过创建和连接节点,你可以轻松地创建自己的工作流程,并自动化处理大量的资源文件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值