标程

火车票订购

http://www.nowcoder.com/questionTerminal/e65887ca7bf14b1b947073f544a6f4f4

公众号:一航代码
以下为标程:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int cmp(const void* a, const void* b)
{
    return *(int*)a - *(int*)b;
}

int unique(int a[], int n)
{
    int i, j;
    if (!n)
        return 0;
    qsort(a, n, sizeof(a[0]), cmp);
    for (i = j = 1; i < n; i++) {
        if (a[i] != a[j - 1])
            a[j++] = a[i];
    }
    return j;
}

int bf(int a[], int n, int val)
{
    int l = 0, r = n;
    while (l < r) {
        if (a[(l + r) / 2] < val)
            l = (l + r) / 2 + 1;
        else
            r = (l + r) / 2;
    }
    return l;
}

int d[1 << 19][2];

int query(int t, int l, int r, int a, int b)
{
    if (l == a && r == b)
        return d[t][1];
    if (d[t][0]) {
        d[t << 1][0] += d[t][0];
        d[t << 1][1] += d[t][0];
        d[t << 1 | 1][0] += d[t][0];
        d[t << 1 | 1][1] += d[t][0];
        d[t][0] = 0;
    }
    if (b <= (l + r) / 2)
        return query(t << 1, l, (l + r) / 2, a, b);
    else if (a >= (l + r) / 2)
        return query(t << 1 | 1, (l + r) / 2, r, a, b);
    else {
        int r1 = query(t << 1, l, (l + r) / 2, a, (l + r) / 2);
        int r2 = query(t << 1 | 1, (l + r) / 2, r, (l + r) / 2, b);
        if (r2 > r1)
            return r2;
        else
            return r1;
    }
}

void update(int t, int l, int r, int a, int b, int val)
{
    if (l == a && r == b) {
        d[t][0] += val;
        d[t][1] += val;
        return;
    }
    if (d[t][0]) {
        d[t << 1][0] += d[t][0];
        d[t << 1][1] += d[t][0];
        d[t << 1 | 1][0] += d[t][0];
        d[t << 1 | 1][1] += d[t][0];
        d[t][0] = 0;
    }
    if (b <= (l + r) / 2)
        update(t << 1, l, (l + r) / 2, a, b, val);
    else if (a >= (l + r) / 2)
        update(t << 1 | 1, (l + r) / 2, r, a, b, val);
    else {
        update(t << 1, l, (l + r) / 2, a, (l + r) / 2, val);
        update(t << 1 | 1, (l + r) / 2, r, (l + r) / 2, b, val);
    }
    if (d[t << 1][1] > d[t << 1 | 1][1])
        d[t][1] = d[t << 1][1];
    else
        d[t][1] = d[t << 1 | 1][1];
}

int x[200000];
int a[100000][3];
int n, m;

int main()
{
    int i, j, k;
    while (scanf("%d %d", &n, &m) != EOF) {
        memset(d, 0, sizeof(d));
        for (i = 0; i < n; i++) {
            scanf("%d %d %d", &a[i][0], &a[i][1], &a[i][2]);
            a[i][1]++;
            x[i * 2] = a[i][0], x[i * 2 + 1] = a[i][1];
        }
        k = unique(x, n + n);
        for (i = 0; i < n; i++) {
            a[i][0] = bf(x, k, a[i][0]);
            a[i][1] = bf(x, k, a[i][1]);
            j = query(1, 0, k, a[i][0], a[i][1]);
            if (j + a[i][2] > m)
                puts("0");
            else {
                puts("1");
                update(1, 0, k, a[i][0], a[i][1], a[i][2]);
            }
        }
    }
    return 0;
}
全部评论

相关推荐

看到这个内容真是闹麻了。。。。。。现在有了AI以后很多人面试都会作弊吗?&nbsp;那对老老实实面试的人岂不是不公平....
程序员牛肉:公平那是对小孩子讲的童话故事,成年人的世界只有能不能接受失败的后果。 你要是能接受面试作弊被发现之后多家公司联合永久拉黑的后果,你就搞。
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-02 15:39
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务