感觉这个数据范围是假的。
明明 ,然后最后遍历的过程 居然跑得飞快(狂笑)。
好吧,来说说正解思路,其实直接考虑把两种播放的方式按照时间排个序,然后每个时间“点”选择最佳的播放方式(如果没有 的就不选,这里我处理成了和 取 )。
由于之前已经给这个节目排过一次序,直接双指针扫描即可。
#include<cstdio>
#include<algorithm>
#define int long long
int init(){
char c = getchar();
int x = 0, f = 1;
for (; c < '0' || c > '9'; c = getchar())
if (c == '-') f = -1;
for (; c >= '0' && c <= '9'; c = getchar())
x = (x << 1) + (x << 3) + (c ^ 48);
return x * f;
}
void print(int x){
if (x < 0) x = -x, putchar('-');
if (x > 9) print(x / 10);
putchar(x % 10 + '0');
}
const int N = (int) 1e5 + 5;
struct Node{
int x, v;
friend bool operator < (const Node&p, const Node&q) {
return p.x < q.x;
}
}a[N], b[N];
int mx(int x, int y){
return x > y ? x : y;
}
signed main(){
int n = init(), m = init(), t = init();
for (int i = 1; i <= n; ++i)
a[i] = (Node) {init(), init()};
for (int i = 1; i <= m; ++i)
b[i] = (Node) {init(), init()};
std::stable_sort(a + 1, a + 1 + n);
std::stable_sort(b + 1, b + 1 + m);
int nxt1 = 1, nxt2 = 1, A = 0, B = 0;
int ans = 0;
for (int i = 0; i < t; ++i) {
if (a[nxt1].x == i && nxt1 + 1 <= t)
A = a[nxt1++].v;
if (b[nxt2].x == i && nxt2 + 1 <= t)
B = b[nxt2++].v;
ans += mx(0, mx(A, B));
}
print(ans), putchar('\n');
}