2024-2025 ICPC, NERC, Northern Eurasia Finals_J. Judicious Watching 反悔贪心

```cpp
#include<bits/stdc++.h>
    
using namespace std;
    
long long t;
const long long N = 2e5 + 10;
long long n,m,q,tot;
long long s[N],c[N],p[N];
struct node {
    long long l,r;
    bool operator < (const node &a) const {
        return r < a.r;
    }
}in[N];
    
void solve() {
    //考虑记录下看每部剧的最早时间,由于剧必须按顺序观看,所以该时间序列一定是不减的,这样对于每个询问就可以二分找出答案
    cin >> n >> m >> q;
    for(long long i = 1;i <= n;i++) cin >> in[i].l;
    for(long long i = 1;i <= n;i++) cin >> in[i].r;
    sort(in + 1,in + 1 + n);
    for(long long i = 1;i <= m;i++) cin >> c[i];
    long long j = 1,tt = 0;
    for(long long i = 1;i <= n;i++) {
        while(j > 0 && tt + in[i].l > in[i].r) {
            //此处反悔,即如果前面看剧导致此时作业不能按时完成,那就让前面看的剧少一些,直到能按时完成,并且退回去的剧所对应的最早时间也要打回成无穷大
            j--;
            tt -= c[j];
            p[j] = 1e9;
        }
        while(j <= m && tt + c[j] + in[i].l <= in[i].r) {
            //如果做完作业的基础上还能看剧,那就一直看
            tt += c[j];
            p[j] = tt;
            j++;
        }
        tt += in[i].l;
    }
    while(j <= m) {
        //如果做完了作业还有剧没看完,就补上
        tt += c[j];
        p[j++] = tt;
    }
    for(long long v,i = 1;i <= q;i++) {
        cin >> v;
        cout << upper_bound(p + 1,p + 1 + m,v) - p - 1 << ' ';
    }
    cout << '\n';
}
    
signed main() {
    ios::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
    cin >> t;
    while(t--) solve();
    
    return 0;
}
posted @ 2025-03-01 10:44  孤枕  阅读(19)  评论(0)    收藏  举报