比赛 2026.5.30 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 雨和卡布奇诺 最终得分 100
用户昵称 xuyuqing 运行时间 0.977 s
代码语言 C++ 内存使用 8.91 MiB
提交时间 2026-05-30 09:50:40
显示代码纯文本

#include <algorithm>
#include <cstdio>
#include <iostream>
#include <queue>
#include <unordered_map>
#include <utility>
#include <vector>

using namespace std;

const int N = 100010;

long long n;
long long m;
unordered_map<long long, long long> nums;
long long needCc[N];
vector<pair<long long, long long>> gives[N];
unordered_map<long long, vector<pair<long long, long long>>> coffee;
queue<long long> q;
long long res;

bool cmp (pair<long long, long long> one, pair<long long, long long> two) {
    return one.second > two.second;
}

int main () {
    
    freopen ("Cappuccino.in", "r", stdin);
    freopen ("Cappuccino.out", "w", stdout);
    
//    cin >> n;
    scanf ("%lld", &n);
    for (long long i = 1; i <= n; i++) {
        long long t;
        long long u;
//        cin >> t >> u;
        scanf ("%lld%lld", &t, &u);
        nums[t] = u;
    }
//    cin >> m;
    scanf ("%lld", &m);
    for (long long i = 1; i <= m; i++) {
        long long l;
//        cin >> l;
        scanf ("%lld", &l);
        bool flag = true;
        for (long long j = 1; j <= l; j++) {
            long long t;
            long long u;
//            cin >> t >> u;
            scanf ("%lld%lld", &t, &u);
            if (u > nums[t]) {
                flag = false;
                needCc[i]++;
                coffee[t].emplace_back(i, u);
            }
        }
        if (flag) {
            q.push(i);
        }
        
        long long k;
//        cin >> k;
        scanf ("%lld", &k);
        for (long long j = 1; j <= k; j++) {
            long long t;
            long long u;
//            cin >> t >> u;
            scanf ("%lld%lld", &t, &u);
            gives[i].emplace_back(t, u);
        }
    }
    
    for (auto it = coffee.begin(); it != coffee.end(); it++) {
        sort (it->second.begin(), it->second.end(), cmp);
    }
    
    while (!q.empty()) {
        long long now = q.front();
        q.pop();
        res++;
        for (auto it = gives[now].begin(); it != gives[now].end(); it++) {
            long long id = it->first;
            long long num = it->second;
            
            nums[id] += num;
            
            for (auto jt = coffee[id].rbegin(); !coffee[id].empty(); jt = coffee[id].rbegin()) {
                long long jd = jt->first;
                long long & need = jt->second;
                
                if (need > nums[id]) {
                    break;
                }
                
                if (needCc[jd] > 0) {
                    needCc[jd]--;
                    
                    if (needCc[jd] == 0) {
                        q.push(jd);
                    }
                }
                
                coffee[id].pop_back();
            }
        }
    }
    
//    cout << res << endl;
    printf ("%lld", res);
    
    return 0;
}