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\n", 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\n", dis[v]);
                    return;
                }
            }
        }
    }
    printf("-1\n");
}

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);
}
posted on 2017-11-04 23:18  WizardCowboy  阅读(93)  评论(0编辑  收藏  举报