题目大意:n个站点,有m群奶牛,第i群奶牛有mi只,要从si站点出发,直到ti站点下车。对于一群奶牛,可以不全部上车。同时在车上的奶牛数不能超过c,求最多能满足多少头奶牛的要求。
Sol:
一开始想到的是非常朴素的费用流,建模通过等式差分十分显然。不过这样会严重超时。
用两个变量now,ans分别记录当前负载,以及答案。
再维护每群奶牛目前剩下的数目num。
将奶牛群按照si从大到小排序,依次处理。
对于当前奶牛群i,我们找出还剩下的奶牛群j中tj<=si的奶牛群,并还原负载:now+=numj.
我们令当前奶牛群全部上车,不过有可能超出负载,那么我们就贪心的减小当前还剩下的ti最大的奶牛群,直到负载满足条件。在这个过程中,更新答案。
这样我们就在O(mlogm)的时间复杂度内解决了此题。
具体实现方面,分别维护大根堆和小根堆,维护ti.
Code:
#include <cstdio>
#include <cstring>
#include <cctype>
#include <iostream>
#include <algorithm>
using namespace std;
#define N 20010
#define M 50010
int n, m;
struct Interval {
int l, r, num;
Interval(int _l = 0, int _r = 0, int _num = 0):l(_l),r(_r),num(_num){}
void r