• [NOIP2014D2]


    T1

    Problem

    洛谷

    Solution

    枚举那个点的位置,再O(n)扫一遍求出覆盖的公共场合的数量。。。
    所以时间复杂度为O(128 * 128 * n)

    Code

    #include<cmath>
    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    #define ll long long
    int x[25], y[25], val[25];
    ll read()
    {
        ll ans = 0; int zf = 1; char ch;
        while (ch != '-' && (ch < '0' || ch > '9')) ch = getchar();
        if (ch == '-') zf = -1, ch = getchar();
        while (ch >= '0' && ch <= '9') ans = ans * 10 + ch - '0', ch = getchar();
        return ans * zf;
    }
    int main()
    {
        int d = read(), n = read(), maxnum = 0, maxX = 0;
        for (int i = 1; i <= n; i++) x[i] = read(), y[i] = read(), val[i] = read();
        for (int xx = 0; xx <= 128; xx++)
            for (int yy = 0; yy <= 128; yy++)
            {
                int num = 0;
                for (int i = 1; i <= n; i++)
                    if (x[i] >= xx - d && x[i] <= xx + d && y[i] >= yy - d && y[i] <= yy + d)
                        num += val[i];
                if (num > maxX)
                {
                    maxX = num;
                    maxnum = 1;
                }
                else if (num == maxX) maxnum++;
            }
        printf("%d %d
    ", maxnum, maxX);
    }
    

    T2

    Problem

    洛谷

    Solution

    注意读入时连是反向边比较好处理。一下都是按反向边处理的。
    先一遍dfs把不能够连到t的点找出来,再把这些点能连到得点也标记掉(也就是原来连着这些点的点)。
    最后没被标记的点做一次bfs就好了。

    Code

    #include<cmath>
    #include<cstdio>
    #include<queue>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    #define ll long long
    queue <int> q;
    ll read()
    {
        ll ans = 0; int zf = 1; char ch;
        while (ch != '-' && (ch < '0' || ch > '9')) ch = getchar();
        if (ch == '-') zf = -1, ch = getchar();
        while (ch >= '0' && ch <= '9') ans = ans * 10 + ch - '0', ch = getchar();
        return ans * zf;
    }
    
    int vet[400005], head[10005], nextx[400005];
    int dis[10005], flag[10005], vis[10005];
    int num = 0, n, m;
    
    void add(int u, int v)
    {
        vet[++num] = v;
        nextx[num] = head[u];
        head[u] = num;
    }
    
    void bfs(int s, int t)
    {
        for (int i = 1; i <= n; i++) dis[i] = 2000000000, vis[i] = 0;
        dis[s] = 0;
        vis[s] = 1;
        q.push(s);
        while (!q.empty())
        {
            int u = q.front();
            q.pop();
            vis[u] = 0;
            for (int i = head[u]; i; i = nextx[i])
            {
                if (!vis[vet[i]] && flag[vet[i]] == 1)
                {
                    int v = vet[i];
                    dis[v] = min(dis[v], dis[u] + 1);
                    q.push(v);
                    vis[v] = 1;
                    if (v == t)
                    {
                        printf("%d
    ", dis[v]);
                        return;
                    }
                }
            }
        }
        printf("-1
    ");
    }
    
    void dfs(int u)
    {
        flag[u] = 1;
        for (int i = head[u]; i; i = nextx[i])
            if (!flag[vet[i]])
                dfs(vet[i]);
    }
    
    int main()
    {
        n = read(), m = read();
        for (int i = 1; i <= m; i++)
        {
            int x = read(), y = read();
            add(y, x);
        }
        int s = read(), t = read();
        dfs(t);
        for (int i = 1; i <= n; i++)
            if (flag[i] == 0)
                for (int j = head[i]; j; j = nextx[j])
                    flag[vet[j]] = -1;
        bfs(t, s);
    }
    
  • 相关阅读:
    2019牛客暑期多校训练营(第二场)
    2019牛客暑期多校训练营(第一场)
    JOISC2014 挂饰("01"背包)
    UPC 2019年第二阶段我要变强个人训练赛第十六场
    UPC个人训练赛第十五场(AtCoder Grand Contest 031)
    Wannafly挑战赛15 C“出队”(约瑟夫环类问题)
    UVA 133“The Dole Queue”(循环报数处理技巧)
    洛谷P1169 [ZJOI2007]棋盘制作 悬线法 动态规划
    洛谷P1273 有线电视网 树上分组背包DP
    CF1097D Makoto and a Blackboard 质因数分解 DP
  • 原文地址:https://www.cnblogs.com/WizardCowboy/p/7785018.html
Copyright © 2020-2023  润新知