已有大佬做法,但是不完善,我码的代码也不完善,第一次写扫描线,请求代码补全
题面
部分做法
问题1
问题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;
}