记录编号 588918 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 雨和卡布奇诺 最终得分 100
用户昵称 Gravatar小金 是否通过 通过
代码语言 C++ 运行时间 0.723 s
提交时间 2024-07-01 20:58:45 内存使用 6.29 MiB
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<unordered_map>
#include<map>
#include<vector>
#include<stack>
#include<set>
using namespace std;
struct require{
    int a,b;
    bool operator < (const require &x) const {
        if(b==x.b) return a<x.a;
        else  return b<x.b;
    }
    require(int A,int B)
    {
        a=A;
        b=B;
    }
};
struct offer{
    int c,d;
    offer(int C,int D)
    {
        c=C;
        d=D;
    }
};
int n,m,p[1000010],ans;
unordered_map<int,int> s;
stack<int> str;
map<int,set<require> > x;
vector<offer> y[100010];
int main()
{
    freopen("Cappuccino.in","r",stdin);
    freopen("Cappuccino.out","w",stdout);
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        int lt,lu;
        scanf("%d%d",&lt,&lu);
        s[lt]=lu;
    }
    scanf("%d",&m);
    for(int i=1;i<=m;i++)
    {
        int l,t=0;
        scanf("%d",&l);
        for(int j=1;j<=l;j++)
        {
            int la,lb;
            scanf("%d%d",&la,&lb);
            if(s[la]>=lb) continue;
            x[la].insert(require(i,lb));
            t++;
        }
        if(t==0)
        {
            str.push(i);
        }
        p[i]=t;
        int k;
        scanf("%d",&k);
        for(int j=1;j<=k;j++)
        {
            int lc,ld;
            scanf("%d%d",&lc,&ld);
            y[i].push_back(offer(lc,ld));
        }
    }
    while(str.size())
    {
        ans++;
        int now=str.top();
        str.pop();
        for(int i=0;i<y[now].size();i++)
        {
            s[y[now][i].c]+=y[now][i].d;
            while(1)
            {
                if(x[y[now][i].c].size()==0) break;
                set<require>::iterator l;
                l=x[y[now][i].c].begin();
                if((l->b) > s[y[now][i].c]) break;
                p[l->a]--;
                if(p[l->a]==0)
                {
                    str.push(l->a);
                }
                x[y[now][i].c].erase(l);
            }
        }
    }
    printf("%d",ans);
    return 0;
}