Codeforces 909E(Coprocessor,双队列维护)
题意:给出n个待处理的事件(0 ~n-1),再给出了n个标(0表示只能在主处理器中处理这个事件,1表示只能在副处理器中处理这个事件),处理器每次能处理多个任务。每个事件有关联,如果一个任务要在副处理器上执行,那它所依赖的任务要么已执行完了,要么和它一起在这个副处理器上同时执行。问副处理器最少调用多少次。
解法:这个题我觉得挺不错的,自己写完后看了一下别人写的题解,觉得在简易程度上没有我的好,所以自己重新写一个自己的理解。毋庸置疑是需要运用拓扑排序的,统计入度InDeg。我开2个队列,队列q1表示处理在coprocessor上的情况,队列q2处理在processor上的情况,这个题就是两个队列来回跳转(why?因为如果单队列,如果你不打ACM做工程的话单队列找点就好了,可这是ACM,会因为暴力找点而TLE)。每一次拓扑排序中如果该点没有入度了,看自己的所处的情况,如果是coprocessor的滚去q1,反之滚去q2,因为如果在同一个拓扑排序中,前面和后面都是一样的(比如都是coprocessor),这个处理完紧接着会处理下一个的,所以可以大可放心。这个题和我之前写的一个很类似,很大程度我是受了那道题的启发写的https://www.cnblogs.com/Anonytt/p/12859856.html
#include<bits/stdc++.h>
#define ll long long
#define rep(i,a,n) for(int i=a;i<=n;i++)
#define per(i,n,a) for(int i=n;i>=a;i--)
#define endl '\n'
#define mem(a,b) memset(a,b,sizeof(a))
#define IO ios::sync_with_stdio(false);cin.tie(0);
using namespace std;
const int INF=0x3f3f3f3f;
const ll inf=0x3f3f3f3f3f3f3f3f;
const int mod=1e9+;
const int maxn=1e5+;
int tot,head[maxn];
struct E{
int to,next;
}edge[maxn<<];
void add(int u,int v){
edge[tot].to=v;
edge[tot].next=head[u];
head[u]=tot++;
}
int n,m,p[maxn],indeg[maxn],vis[maxn],ans,num=;
vector<int> vec;
queue<int>q1,q2;
void topsort1(){
while(!q1.empty()){
int now=q1.front();q1.pop();
if(p[now]!=) continue;
if(p[now]==) num+=;
for(int i=head[now];i!=-;i=edge[i].next){
int v=edge[i].to;
--indeg[v];
if(indeg[v]==&&p[v]==) q1.push(v);
if(indeg[v]==&&p[v]==) q2.push(v);
}
}
}
void topsort2(){
while(!q2.empty()){
int now=q2.front();q2.pop();
if(p[now]!=) continue;
if(p[now]==) num+=;
for(int i=head[now];i!=-;i=edge[i].next){
int v=edge[i].to;
--indeg[v];
if(indeg[v]==&&p[v]==) q1.push(v);
if(indeg[v]==&&p[v]==) q2.push(v);
}
}
}
int main(){
cin>>n>>m;mem(head,-);
rep(i,,n) cin>>p[i],vec.push_back(i);
while(m--){
int v,u;cin>>v>>u;++u,++v;
add(u,v);indeg[v]++;
}
int e=;
rep(i,,n){
if(!indeg[i]&&!vis[i]&&p[i]==) vis[i]=,q1.push(i);
if(!indeg[i]&&!vis[i]&&p[i]==) vis[i]=,q2.push(i);
}
while(num!=n){
e=-e;
if(e==) topsort1(),ans+=;
if(e==) topsort2();
}
cout<<ans<<endl;
}
Codeforces 909E(Coprocessor,双队列维护)的更多相关文章
- CodeForces 909E Coprocessor(无脑拓扑排序)
You are given a program you want to execute as a set of tasks organized in a dependency graph. The d ...
- Codeforces 909E. Coprocessor (拓扑、模拟)
题目链接: Coprocessor 题意: 给出n个待处理的事件(0 - n-1),再给出了n个标(0表示只能在主处理器中处理这个事件,1表示只能在副处理器中处理这个事件),处理器每次能处理多个任务. ...
- CodeForces 909E Coprocessor
题解. 贪心,拓扑排序. 和拓扑排序一样,先把$flag$为$0$的点能删的都删光,露出来的肯定都是$flag$为$0$的,然后疯狂删$flag$为$0$的,这些会使答案加$1$,反复操作就可以了. ...
- Codeforces 1195E OpenStreetMap 单调队列套单调队列
题意:给你一个n * m的矩阵,问所有的a * b的子矩阵的最小的元素的和是多少.题目给出了矩阵中的数的数据生成器. 思路:如果这个问题是1维的,即求所有区间的最小元素的和,用单调队列O(n)就可以做 ...
- 王霸雄图荣华敝屣,谈笑间尽归尘土|基于Python3双队列数据结构搭建股票/外汇交易匹配撮合系统
原文转载自「刘悦的技术博客」https://v3u.cn/a_id_192 如果你爱他,那么送他去股市,因为那里是天堂:如果你恨他,送他去股市,因为那里是地狱. 在过去的一年里,新冠疫情持续冲击世界经 ...
- Codeforces Round #455 (Div. 2) 909E. Coprocessor
题 OvO http://codeforces.com/contest/909/problem/E CF455 div2 E CF 909E 解 类似于拓扑排序地进行贪心, 对于 Ei=0 并且入度为 ...
- Codeforces 1105D(Kilani and the Game,双队列bfs)
AC代码: #include<bits/stdc++.h> #define ll long long #define endl '\n' #define mem(a,b) memset(a ...
- Codeforces 1064D Labyrinth(双端队列BFS)
题意: 给一个图,"*"不可以走,给你一个起点,限制向左走L次,向右走R次,上下不限制,问你最多可以走到多少个格子 思路: BFS,每次将上下走的策略加入队首,左右加入队尾,(相当 ...
- BZOJ 1342: [Baltic2007]Sound静音问题 | 单调队列维护的好题
题目: 给n个数字,一段合法区间[l,l+m-1]要求max-min<=c 输出所有合法区间的左端点,如果没有输出NONE 题解: 单调队列同时维护最大值和最小值 #include<cst ...
随机推荐
- Python之小型信息管理系统
#Author:msq #Time:2019/11/16 import re import os filename = "person.txt" def menu(): #输出菜单 ...
- Python操作三大主流数据库
Python 标准数据库接口为 Python DB-API,Python DB-API为开发人员提供了数据库应用编程接口. Python 数据库接口支持非常多的数据库,你可以选择适合你项目的数据库: ...
- elementaryos5安装chrome,修复依赖
1.首先去下载个chrome:https://www.google.cn/chrome/ 2.尝试安装chrome:sudo dpkg -i google-chrome-stable_current_ ...
- 2019-2020-1 20199303 《Linux内核原理与分析》 第十一周作业
缓冲区溢出漏洞实验 安装一些用于编译C程序的32位软件包 sudo apt-get install -y lib32z1 libc6-dev-i386 sudo apt-get install -y ...
- python学习19类5之多态与鸭子模型
'''''''''一.多态1.Python中多态是指一类事物有多种形态.''' class Animal: def run(self): raise AttributeError('子类必须实现这个方 ...
- redis部署与卸载
1.先到Redis官网(redis.io)下载redis安装包 cd /tmp wget http://download.redis.io/releases/redis-4.0.10.tar.gz 2 ...
- Qt 用户通过对话框选择文件
void class::on_pushButton_clicked() { fileFullPath = QFileDialog::getOpenFileName(this, tr("Sel ...
- Add text to 'Ready Page' in Inno Setup
https://stackoverflow.com/questions/1218411/add-text-to-ready-page-in-inno-setup
- eclipse自动补全导致变量会跟上String后缀的问题解决
https://blog.csdn.net/feinifi/article/details/103665860
- 走 进 java 的 四 个 基 本 特 性
赶上明天就还是五一c小长假了,准备在这几天写几篇原创文章,供大家一起学习. 首先今天就来好好地唠一唠,到底java的那几个特性都是什么呢?到底怎么用呢?相信一定有一些小白对此会有些懊恼,没关系的,谁还 ...