关于刚刚求助的站外题
  • 板块学术版
  • 楼主Helloworld_Dk
  • 当前回复6
  • 已保存回复6
  • 发布时间2022/8/14 11:32
  • 上次更新2023/10/27 15:30:02
查看原帖
关于刚刚求助的站外题
116075
Helloworld_Dk楼主2022/8/14 11:32

已有大佬做法,但是不完善,我码的代码也不完善,第一次写扫描线,请求代码补全

题面

TIrXR.png

部分做法

Tsu5X.png

问题1

TVgbK.png

问题2

费用处理

部分code


#include <iostream>
#include <cmath>
#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <vector>
#include <random>
using namespace std;
#define maxn 200005
#define modn 998244353
#define lint long long
int n, m, k;
class Plan
{
public:
    int type; // =1 join =-1 quit
    int _tim;
    int cpid;
    int cos;
    const bool operator<(const Plan _b) const
    {
        return this->_tim < _b._tim;
    }
} plans[maxn];
class tn
{
public:
    int l;
    int r;
    int sum;
} tr[(maxn) << 2];
void pushup(int u)
{
    tr[u].sum = tr[u << 1].sum + tr[(u << 1) + 1].sum;
}
int timlast[maxn];
int cosbegg[maxn];
void build(int u, int l, int r)
{
    tr[u].l = l;
    tr[u].r = r;
    if (l == r)
    {
        tr[u].sum = 0;
        return;
    }
    int mid = (l + r) >> 1;
    build(u << 1, l, mid);
    build((u << 1) + 1, mid + 1, r);
    pushup(u);
}
void modify(int u, int targ, int x) // add x
{
    if (tr[u].l == targ && tr[u].r == targ)
    {
        tr[u].sum += x;
        return;
    }
    int mid = (tr[u].l + tr[u].r) >> 1;
    if (targ <= mid)
        modify(u << 1, targ, x);
    else
        modify((u << 1) + 1, targ, x);
    pushup(u);
}
int queryall()
{
    return tr[1].sum;
}

int idlst[maxn];

long long cosall = 0;
int main()
{
    long long mincos = 100000005;
    scanf("%d%d%d", &n, &m, &k);
    for (int i = 1; i <= n; i++)
        timlast[i] = 100000000;

    for (int i = 1; i <= m; i++)
    {
        int d, f, t, c;
        scanf("%d%d%d%d", &d, &f, &t, &c);
        if (f)
        { // t==0
            plans[i].cpid = f;
            plans[i]._tim = d;
            plans[i].cos = c;
            plans[i].type = 1;
        }
        else
        {
            plans[i].cpid = t;
            plans[i]._tim = d;
            plans[i].cos = c;
            plans[i].type = -1;
        }
    }
    sort(plans + 1, plans + 1 + m);
    build(1, 1, n);
    plans[0]._tim = 0;
    for (int i = 1; i <= m; i++)
    {
        if ((plans[i].type == -1) && plans[i]._tim - timlast[plans[i].cpid] < k - 2)
            continue;
        int dura = plans[i]._tim - plans[i - 1]._tim;
        Plan np = plans[i];
        // if(np.type==-1) {
        // //     timlast[plans[i].cpid]=100000000;
        // //     cosall-=plans[idlst[plans[i].cpid]].cos;
        // // }
        if (timlast[plans[i].cpid] == 100000000 && np.type == 1)
        {
            timlast[plans[i].cpid] = np._tim;
            // cosall+=np.cos;
        }
        cosall += np.cos;
        modify(1, np.cpid, np.type);
        // cout << queryall() << ' ' << dura << endl;
        if ((queryall() >= n) && (dura >= (k)))
        {
            mincos = min(mincos, cosall);
        }
        if (np.type == -1)
        {
            cosall -= np.cos;
        }
    }
    if (mincos == 100000005)
    {
        printf("-1\n");
    }
    else
    {
        printf("%lld\n", mincos);
    }
    return 0;
}


2022/8/14 11:32
加载中...