社区讨论

为什么超时?

P1607[USACO09FEB] Fair Shuttle G参与者 2已保存回复 2

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@mi6i8owb
此快照首次捕获于
2025/11/20 05:18
4 个月前
此快照最后确认于
2025/11/20 05:18
4 个月前
查看原帖
检查不出来了。。
CPP
#include <cstdio>
#include <iostream>
#include <algorithm>
#define N 50001
#define root 1, 1, n
#define ls now << 1, l, mid
#define rs now << 1 | 1, mid + 1, r
#define max(x, y) ((x) > (y) ? (x) : (y))
#define min(x, y) ((x) < (y) ? (x) : (y))
int k, n, c, ans;
int sum[N << 2], add[N << 2];
struct node
{
    int s, e, m;
}p[N];
inline bool cmp(node x, node y)
{
    return x.e < y.e || (x.e == y.e && x.s > y.s);
}
inline void push_down(int now)
{
    if(add[now])
    {
        add[now << 1] += add[now];
        sum[now << 1] += add[now];
        add[now << 1 | 1] += add[now];
        sum[now << 1 | 1] += add[now];
        add[now] = 0; 
    }
}
inline int query(int now, int l, int r, int x, int y)
{
    if(x <= l && r <= y) return sum[now];
    push_down(now);
    int mid = (l + r) >> 1, ret = 0xafffffff;
    if(x <= mid) ret = max(ret, query(ls, x, y));
    if(mid < y) ret = max(ret, query(rs, x, y));
    return ret;
}
inline void update(int now, int l, int r, int x, int y, int d)
{
    if(x <= l && r <= y)
    {
        sum[now] += d;
        add[now] += d;
        return;
    }
    push_down(now);
    int mid = (l + r) >> 1;
    if(x <= mid) update(ls, x, y, d);
    if(mid < y) update(rs, x, y, d);
    sum[now] = max(sum[now << 1], sum[now << 1 | 1]);
}
int main()
{
    int i, x;
    scanf("%d %d %d", &k, &n, &c);
    for(i = 1; i <= k; i++)
        scanf("%d %d %d", &p[i].s, &p[i].e, &p[i].m);
    std::sort(p + 1, p + k + 1, cmp);
    for(i = 1; i <= k; i++)
    {
        x = min(p[i].m, c - query(root, p[i].s, p[i].e - 1));
        if(x)
        {
            update(root, p[i].s, p[i].e - 1, x);
            ans += x;
        }
    }
    printf("%d\n", ans);
    return 0;
}

回复

2 条回复,欢迎继续交流。

正在加载回复...