感觉这个数据范围是假的。

明明 T109T\le10^9,然后最后遍历的过程 O(T)O(T) 居然跑得飞快(狂笑)。

好吧,来说说正解思路,其实直接考虑把两种播放的方式按照时间排个序,然后每个时间“点”选择最佳的播放方式(如果没有 0\ge0 的就不选,这里我处理成了和 00max\max)。

由于之前已经给这个节目排过一次序,直接双指针扫描即可。

#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');
}