先开始在贪心,网络流,dp 方面思考,然后最后确定了是贪心,然后就排了个顺序,由于受dp思想的严重侵害,导致没能想到只要把能上的都上了这种解法而没有解出
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long ll;
int k, n, c;
struct treee
{
int maxx, addall;
};
treee tree[80000];
void pushdown(int k)
{
int l =k<<1;
int r = k<<1|1;
if (tree[k].addall)
{
tree[l].addall += tree[k].addall;
tree[l].maxx += tree[k].addall;
tree[r].addall += tree[k].addall;
tree[r].maxx += tree[k].addall;
tree[k].addall = 0;
}
return;
}
void pushup(int k)
{
int l = k<<1; int r = k<<1|1;
tree[k].maxx = min(tree[l].maxx, tree[r].maxx);
return;
}
void add(int v, int ll, int rr, int l, int r, int k)
{
if (l >= ll&&r <= rr)
{
tree[k].addall += v;
tree[k].maxx += v;
return;
}
int mid = (l + r) >> 1;
pushdown(k);
if (mid >= ll)add(v, ll, rr, l, mid, k << 1);
if (mid + 1 <= rr)add(v, ll, rr, mid + 1, r, k << 1 | 1);
pushup(k);
return;
}
void build(int l, int r, int k)
{
if (l == r)
{
tree[k].maxx = c;
return;
}
int ll = k << 1; int rr = k << 1 | 1; int mid = (l + r) >> 1;
build(l, mid, k << 1);
build(mid + 1, r, k << 1 | 1);
tree[k].maxx = min(tree[ll].maxx, tree[rr].maxx);
return;
}
int check(int l, int r, int ll, int rr, int k)
{
if (ll >= l&&rr <= r)
{
return tree[k].maxx;
}
int temp1 = -1; int temp2 = -1;
int mid = (ll + rr) >> 1;
pushdown(k);
if (l <= mid)temp1 = check(l, r, ll, mid, k << 1);
if (mid + 1 <= r)temp2 = check(l, r, mid + 1,rr, k << 1 | 1);
pushup(k);
if (temp1 == -1 && temp2 != -1)
return temp2;
if (temp2 == -1 && temp1 != -1)
return temp1;
return min(temp1, temp2);
}
struct nodee
{
int l, r, all;
};
nodee node[80000];
bool com(nodee a, nodee b)
{
if (a.r == b.r)
{
return a.l > b.l;
}
else
return a.r < b.r;
}
int main()
{
scanf("%d%d%d", &k, &n, &c);
int i;
for (i = 0; i < k; i++)
{
scanf("%d%d%d", &node[i].l, &node[i].r, &node[i].all);
}
sort(node, node + i, com);
build(1,n,1);
ll ans = 0;
for (int j = 0; j < i; j++)
{
int t = check(node[j].l, node[j].r-1, 1, n, 1);
t = min(t, node[j].all);
ans += t;
add(-t, node[j].l, node[j].r-1, 1, n, 1);
}
printf("%lld\n", ans);
}