码迷,mamicode.com
首页 > 其他好文 > 详细

解题报告 『[USACO07JAN]Tallest Cow(差分)』

时间:2019-05-02 21:26:43      阅读:122      评论:0      收藏:0      [点我收藏+]

标签:ble   e30   reg   spl   辅助   make   print   targe   身高   

原题地址

建立一个数组high,若一对关系指明Ai与Bi可以互相看见(Ai < Bi),则把数组high中下标为Ai + 1到Bi - 1的数都减去1,意为Ai到Bi之间的牛的身高至少比它们少1。

再加一个辅助数组sup可以将时间复杂度由O(NM)降到O(N + M)。

 

代码实现如下:

技术图片
#include <bits/stdc++.h>
using namespace std;
#define rep(i, a, b) for (register int i = a; i <= b; i++)

const int maxn = 1e4 + 5;

int n, p, h, r;
int sup[maxn], high[maxn];
bool vis[maxn][maxn];

int read() {
    int x = 0, flag = 0;
    char ch =  ;
    while (ch != - && (ch < 0 || ch > 9)) ch = getchar();
    if (ch == -) {
        flag = 1;
        ch = getchar();
    }
    while (ch >= 0 && ch <= 9) {
        x = (x << 1) + (x << 3) + ch - 0;
        ch = getchar();
    }
    return flag ? -x : x;
}

void write(int x) {
    if (x < 0) {
        putchar(-);
        x = -x;
    }
    if (x > 9) write(x / 10);
    putchar(x % 10 + 0);
}

int main() {
    n = read(), p = read(), h = read(), r = read();
    rep(i, 1, r) {
        int u, v;
        u = read(), v = read();
        if (u > v) swap(u, v);
        if (vis[u][v]) continue;
        sup[u + 1]--;
        sup[v]++;
        vis[u][v] = 1;
    }
    rep (i, 1, n) {
        high[i] = high[i - 1] + sup[i];
        write(h + high[i]);
        printf("\n");
    }
    return 0;
}
View Code

 

值得注意的是,本题关系对是有可能重复给出的,因此我用了bool数组vis来判断,然而这是一个二维数组,很有可能爆空间,此题只是勉强卡过,更好的做法是使用map。

 

代码实现如下:

技术图片
#include <bits/stdc++.h>
using namespace std;
#define rep(i, a, b) for (register int i = a; i <= b; i++)

const int maxn = 1e4 + 5;

int n, p, h, m;
int sup[maxn], high[maxn];

map<pair<int, int>, bool> existed;

int read() {
    int x = 0, flag = 0;
    char ch =  ;
    while (ch != - && (ch < 0 || ch > 9)) ch = getchar();
    if (ch == -) {
        flag = 1;
        ch = getchar();
    }
    while (ch >= 0 && ch <= 9) {
        x = (x << 1) + (x << 3) + ch - 0;
        ch = getchar();
    }
    return flag ? -x : x;
}

void write(int x) {
    if (x < 0) {
        putchar(-);
        x = -x;
    }
    if (x > 9) write(x / 10);
    putchar(x % 10 + 0);
}

int main() {
    n = read(), p = read(), h = read(), m = read();
    rep(i, 1, m) {
        int u, v;
        u = read(), v = read();
        if (u > v) swap(u, v);
        if (existed[make_pair(u, v)]) continue;
        sup[u + 1]--;
        sup[v]++;
        existed[make_pair(u, v)] = 1;
    }
    rep (i, 1, n) {
        high[i] = high[i - 1] + sup[i];
        write(h + high[i]);
        printf("\n");
    }
    return 0;
}
View Code

解题报告 『[USACO07JAN]Tallest Cow(差分)』

标签:ble   e30   reg   spl   辅助   make   print   targe   身高   

原文地址:https://www.cnblogs.com/Kirisame-Marisa/p/10803325.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!