记录编号 |
588918 |
评测结果 |
AAAAAAAAAAAAAAAAAAAA |
题目名称 |
雨和卡布奇诺 |
最终得分 |
100 |
用户昵称 |
小金 |
是否通过 |
通过 |
代码语言 |
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",<,&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;
}