题目链接

戳我

\(Solution\)

我们来分析题目。

实际上就是求一个拓扑序满足拓扑序的前缀最大值最多/最少

对于第一种情况,很明显一直选当前能选的最小的是最优的对吧。因为你需要大的尽可能多。用个堆维护就好了

但是很多人第二种情况想当然了,认为一直取最大值就可以了,但是这种行为太\(Naive\)了。我们需要讨论一下,如果当前能取的最小值不是前缀最大值,则需要先选他,否则就选能选的最大值,因为你选了这个最小值以后可能释放一个比当前最大值更大的值,这样子答案就可能会更优。那么这个怎么维护呢,用个\(set\)就好了,如果不会看下代码吧

\(Code\)

#include<bits/stdc++.h>
#define rg register
#define file(x) freopen(x".in","r",stdin);freopen(x".out","w",stdout);
using namespace std;
int read(){
int x=0,f=1;char c=getchar();
while(c<'0'||c>'9') f=(c=='-')?-1:1,c=getchar();
while(c>='0'&&c<='9') x=x*10+c-48,c=getchar();
return f*x;
}
struct node {
int to,next;
}a[1000001];
int head[1000001],cnt,n,m,x,y;
int vis[1000001];
int bj[1000001];
set<int> s;
priority_queue<int,vector<int>,greater<int> > p;
void add(int x,int y){
a[++cnt].to=y;
a[cnt].next=head[x];
head[x]=cnt;
}
void solve1(){
int maxx=0,ans=0;
while(!p.empty()){
int now=p.top();
p.pop();
if(now>maxx) maxx=now,ans++;
for(int i=head[now];i;i=a[i].next){
int v=a[i].to;
vis[v]--;
if(!vis[v]) p.push(v);
}
}
printf("%d\n",ans);
}
void solve2(){
int maxx=0,ans=0;
while(!s.empty()){
set<int>::iterator it=s.end();it--;
set<int>::iterator it2=s.begin();
int now1=*it2,now=now1;
if(now1>maxx) now=*it;
s.erase(now);
if(now>maxx) maxx=now,ans++;
for(int i=head[now];i;i=a[i].next){
int v=a[i].to;
bj[v]--;
if(!bj[v]) s.insert(v);
}
}
cout<<ans;
}
int main(){
n=read(),m=read();
for(int i=1;i<=m;i++)
x=read(),y=read(),add(x,y),vis[y]++,bj[y]++;
for(int i=1;i<=n;i++)
if(!vis[i]) s.insert(i),p.push(i);
solve1();
solve2();
return 0;
}

「Luogu P5603」小O与桌游的更多相关文章

  1. 「Luogu P5601」小D与笔试

    题目链接 戳我 \(Solution\) 这道题官方题解的做法太复杂了,还需要扫字符串. 其实只需要两个\(map\)就好了. 一个\(map<string,stirng>\)用来记录题目 ...

  2. 「Luogu P5602」小E与美食

    题目链接 戳我 \(Solution\) 这道题只需要枚举吃\(k\)个美食,最后在取前\(k\)大的美味值.对于每个算出答案后取\(max\) \(Code\) #include<bits/s ...

  3. 「国家集训队」小Z的袜子

    「国家集训队」小Z的袜子 传送门 莫队板子题. 注意计算答案的时候,由于分子分母都要除以2,所以可以直接约掉,这样在开桶算的时候也方便一些. 参考代码: #include <algorithm& ...

  4. Luogu P5603 小C与桌游【贪心+拓扑排序】

    [Description]https://www.luogu.com.cn/problem/P5603 \(\;\) 题意可以简化为:一个不保证联通,n个点,m条边的DAG(有向无环图),构造一个拓扑 ...

  5. 「 Luogu P1231 」 教辅的组成

    题目大意 有 $\text{N1}$ 本书 $\text{N2}$本练习册 $\text{N3}$本答案,一本书只能和一本练习册和一本答案配对.给你一些书和练习册,书和答案的可能的配对关系.问你最多可 ...

  6. 「Luogu 1525」关押罪犯

    更好的阅读体验 Portal Portal1: Luogu Portal2: LibreOJ Description \(S\)城现有两座监狱,一共关押着\(N\)名罪犯,编号分别为\(1 - N\) ...

  7. 「 Luogu P2230 」X 「 Vijos 1142 」 HXOS系统

    题目描述可能稍有偏差,但实质上是一样的. 看下面 题目大意 题面这么长,先说说题意吧. 就是有一个操作系统,他的存储方式是树形的.其中分为文件和目录(文件夹)每一个子目录下只能存储 $K$ 个文件或目 ...

  8. 「Luogu 2367」语文成绩

    更好的阅读体验 Portal Portal1: Luogu Description 语文老师总是写错成绩,所以当她修改成绩的时候,总是累得不行.她总是要一遍遍地给某些同学增加分数,又要注意最低分是多少 ...

  9. 「Luogu 1821」[USACO07FEB]银牛派对Silver Cow Party

    更好的阅读体验 Portal Portal1: Luogu Portal2: POJ Description One cow from each of N farms \((1 \le N \le 1 ...

随机推荐

  1. React学习——通过模态框中的表单,学习父子组件之间传值

    import { Button, Modal, Form, Input, Radio } from 'antd'; const CollectionCreateForm = Form.create({ ...

  2. 【Git的基本操作一】文件初始化及设置签名

    1. 本地库初始化 命令: git init 效果: 

  3. vue-cli3开干

    npm install -g @vue/cli-service-global vue create hello-world

  4. OO方式实现ALV: cl_salv_table

    这里总结最近用cl_salv_table实现ALV遇到问题和解决办法 FORM set_alv2 . DATA: lv_syrepid TYPE syrepid. lv_syrepid = sy-cp ...

  5. java 中 get post

    package wzh.Http; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStr ...

  6. maven入门-- part1 简介

    Maven是什么 maven是基于项目对象模型(pom:project object model),可以通过一小段描述信息来管理项目的构建,报告和文档的项目管理工具.对依赖关系的特性进行细致的分析和划 ...

  7. python中的负数取模问题(一个大坑)

    先来看一段代码 这是什么情况?为什么会出现这种结果.我们再来看看其它语言的执行结果 我们用golang.js.c分别算了一下,结果得到的结果都是一致的,但是python为啥不一样呢? 其实之所以这么做 ...

  8. STM32WB SRAM2

    SRAM2存储: 1.挂接总线及地址大小 2.地址镜像 3.RDP(read protection)等级 4.不同等级下的访问状态 5.声明位于SRAM2区中的数据 1)在icf文件中定义region ...

  9. 9.1.远程过程调用协议_RPC

    6. RPC 6.1.什么是 RPC RPC(Remote Procedure Call Protocol)远程过程调用协议 通俗的描述是:客户端在不知道调用细节的情况下,调用存在于远程计算机上的某个 ...

  10. jsp学习——九大内置对象

    JSP一共有九个内置对象,分别为:request.response.session.application.out.pagecontext.config.page.exception 博客:JSP的九 ...