B. Building Company

Problem - B - Codeforces

 

思路:我们能够发现这其实类似于操作系统的问题,其思想就是我们先把能完成的工程完成,然后加入完成工程后得到的奖励,然后再看是否会有新的工程能够完成,然后一直重复知道不会再出现新的工程能够完成,对于一个工程来说如果其中的一个需求目前已经能够满足了,那么之后是一定会满足的,所以我们就不需要再检查它是否满足了,基于这一点,我们可以考虑对所有的工种建立一个优先队列,存储哪个工程需要这个工种多少个,同时还需要标记一下当前工程还有几个需求需要满足,如果说当前工种的是数量能够满足当前需要该工种的工程的最小需求量,则将其弹出堆,同时将该工程的需求量减一,如果某个工程的需求都被满足了,那么我们就将这个工程对应的奖励添加上,同时检查一下被添加的工种再添加之后会不会满足某个工程对该工种的需求 ,直到不能够再被更新,最后只需要检查一下所有需求都被满足的工程的数量即可

// Problem: B. Building Company
// Contest: Codeforces - The 13th Shandong ICPC Provincial Collegiate Programming Contest
// URL: https://codeforces.com/gym/104417/problem/B
// Memory Limit: 1024 MB
// Time Limit: 2000 ms#include<iostream>
#include<cstring>
#include<string>
#include<sstream>
#include<cmath>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<map>
#include<stack>
#include<vector> 
#include<set>
#include<unordered_map>
#include<ctime>
#include<cstdlib>
#define fi first
#define se second
#define i128 __int128
using namespace std;
typedef long long ll;
typedef double db;
typedef pair<int,int> PII;
typedef pair<int,pair<int,int> > PIII;
const double eps=1e-7;
const int N=2e5+7 ,M=5e5+7, INF=0x3f3f3f3f,mod=1e9+7,mod1=998244353;
const long long int llINF=0x3f3f3f3f3f3f3f3f;
inline ll read() {ll x=0,f=1;char c=getchar();while(c<'0'||c>'9') {if(c=='-') f=-1;c=getchar();}
while(c>='0'&&c<='9') {x=(ll)x*10+c-'0';c=getchar();} return x*f;}
inline void write(ll x) {if(x < 0) {putchar('-'); x = -x;}if(x >= 10) write(x / 10);putchar(x % 10 + '0');}
inline void write(ll x,char ch) {write(x);putchar(ch);}
void stin() {freopen("in_put.txt","r",stdin);freopen("my_out_put.txt","w",stdout);}
bool cmp0(int a,int b) {return a>b;}
template<typename T> T gcd(T a,T b) {return b==0?a:gcd(b,a%b);}
template<typename T> T lcm(T a,T b) {return a*b/gcd(a,b);}
void hack() {printf("\n----------------------------------\n");}int T,hackT;
int n,m,k;
int g;
ll vis[N];
vector<PII> s[N];
int po[N];
priority_queue<PII,vector<PII>,greater<PII> > q[N];void solve() {g=read();int timestemp=0;map<int,int> st;for(int i=1;i<=g;i++) {int a=read(),b=read();if(st[a]==0) st[a]=++timestemp;vis[st[a]]+=b;}n=read();for(int i=1;i<=n;i++) {int mi=read();po[i]=mi;for(int j=1;j<=mi;j++) {int a=read(),b=read();if(st[a]==0) st[a]=++timestemp;q[st[a]].push({b,i});}int ki=read();for(int j=1;j<=ki;j++) {int a=read(),b=read();s[i].push_back({a,b});}}queue<int> sy,ti;for(int i=1;i<=n;i++) if(po[i]==0) ti.push(i);for(int i=1;i<=200000;i++) {while(q[i].size()!=0&&q[i].top().fi<=vis[i]) {po[q[i].top().se]--;if(po[q[i].top().se]==0) ti.push(q[i].top().se);q[i].pop();}}while(sy.size()!=0||ti.size()!=0) {while(ti.size()!=0) {int t=ti.front();ti.pop();for(int j=0;j<s[t].size();j++) {int a=s[t][j].fi,b=s[t][j].se;if(st[a]==0) st[a]=++timestemp;vis[st[a]]+=b;sy.push(st[a]);}}while(sy.size()!=0) {int t=sy.front();sy.pop();while(q[t].size()!=0&&q[t].top().fi<=vis[t]) {po[q[t].top().se]--;if(po[q[t].top().se]==0) ti.push(q[t].top().se);q[t].pop();}}}int res=0;for(int i=1;i<=n;i++) if(po[i]==0) res++;printf("%d\n",res);
}   int main() {// init();// stin();// scanf("%d",&T);T=1; while(T--) hackT++,solve();return 0;       
}          

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/17599.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Unity/Shader 零碎知识点

来源&#xff1a;shader入门精要-冯乐乐 坐标系 Unity使用的是左手坐标系&#xff1b;观察空间&#xff0c;通俗来讲就是以摄像机为原点的坐标系&#xff0c;摄像机的前向是z轴的负方向&#xff0c;与模型和世界空间中的定义相反&#xff0c;z轴的坐标减少意味着场景深度的增加…

【动手学习深度学习--逐行代码解析合集】08模型选择、欠拟合和过拟合

【动手学习深度学习】逐行代码解析合集 08模型选择、欠拟合和过拟合 视频链接&#xff1a;动手学习深度学习–模型选择、欠拟合和过拟合 课程主页&#xff1a;https://courses.d2l.ai/zh-v2/ 教材&#xff1a;https://zh-v2.d2l.ai/ 1、生成数据集 import math import numpy a…

PROFINET转ETHERNET/IP网关西门子通讯协议profinet

大家好&#xff0c;今天我们来聊一款令人兴奋的产品——远创智控YC-PN-EIP&#xff01;它是一款自主研发的 PROFINET 从站功能的通讯网关&#xff0c;可以将 PROFINET网络和ETHERNET/IP 网络连接起来&#xff0c;实现数据传输和交换。但这只是它的基础功能&#xff0c;它还有哪…

word因导入mathtype不能使用复制粘贴快捷键的解决方法

1. 我们安装完mathtype后&#xff0c;有时会有两个mathtype显示&#xff0c;其中一个是属于office文件夹下的&#xff0c;另一个是win文件夹下的。如图&#xff1a; 2. 如果word中的复制粘贴快捷键&#xff08;CTRLC和CTRLV&#xff09;不能用&#xff0c;通常是因为office路径…

命名管道使用示例

用命名管道实现client和server端进行通信 【实现步骤】 创建两个没有关系的进程--》编写client和server源文件&#xff0c;并分别编译成可执行程序&#xff1b;创建命名管道文件&#xff0c;用函数int mkfifo(const char *filename,mode_t mode);client端以写的方式打开管道文…

15、Java中的异常体系

Java中的所有异常都来自顶级父类ThrowableThrowable下有两个子类Exception和ErrorError是程序无法处理的错误&#xff0c;一旦出现这个错误&#xff0c;则程序将被迫停止运行Exception不会导致程序停止&#xff0c;又分为两个部分RunTimeException运行时异常和CheckedException…

【微信小程序创作之路】- 小程序中WXML、JS、JSON、WXSS作用

【微信小程序创作之路】- 小程序中WXML、JS、JSON、WXSS作用 第三章 微信小程序WXML、JS、JSON、WXSS作用 文章目录 【微信小程序创作之路】- 小程序中WXML、JS、JSON、WXSS作用前言一、WXML是什么&#xff1f;二、JS是什么&#xff1f;三、JSON是什么&#xff1f;四、WXSS是什…

漫谈大数据时代的个人信息安全(一)——“按图索骥”

大数据时代的个人信息安全系列——“按图索骥” 一、寻找王珞丹二、啥是Exif &#xff1f;三、个人信息保护小贴士 近日&#xff0c;某高校毕业生在校期间窃取学校内网数据&#xff0c;收集全校学生个人隐私信息的新闻引发了人们对大数据时代个人信息安全问题的再度关注。在大数…

计算机体系结构基础知识介绍之缓存性能的十大进阶优化之减少命中时间和流水线访问和多组缓存增加带宽(三)

优化二&#xff1a;减少命中时间的方式预测 路预测是一种高速缓存优化技术&#xff0c;它在高速缓存中保存额外的位来预测下一次高速缓存访问的路&#xff08;或者组内的块&#xff09;。这种预测可以提前设置多路选择器来选择期望的块&#xff0c;并且在那个时钟周期内&#…

Azure Kinect 之 Note(一)

Azure Kinect Azure Kinect DK 是一款开发人员工具包&#xff0c;配有先进的AI 传感器&#xff0c;提供复杂的计算机视觉和语音模型。 Kinect 将深度传感器、空间麦克风阵列与视频摄像头和方向传感器整合成一体式的小型设备&#xff0c;提供多种模式、选项和软件开发工具包(S…

「网络编程」应用层协议_ HTTP协议学习及深入理解

「前言」文章内容大致是应用层协议的HTTP协议讲解。 「归属专栏」网络编程 「主页链接」个人主页 「笔者」枫叶先生(fy) 「枫叶先生有点文青病」「句子分享」 俗话说&#xff0c;开弓没有回头箭&#xff0c;唯有箭折、箭落、箭中靶子三种结果而已。 ——江晓英《苏东坡&#xf…

diffusion model(四)文生图diffusion model(classifier-free guided)

文章目录 系列阅读 文生图diffusion model&#xff08;classifier-free guided&#xff09;背景方法大意模型如何融入类别信息&#xff08;或语义信息&#xff09;采用交叉注意力机制融入基于channel-wise attention融入 如何训练 ϵ θ ( x t , y , t ) \epsilon_{\theta}(x_t…