「Luogu P5603」小O与桌游
题目链接
\(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与桌游的更多相关文章
- 「Luogu P5601」小D与笔试
题目链接 戳我 \(Solution\) 这道题官方题解的做法太复杂了,还需要扫字符串. 其实只需要两个\(map\)就好了. 一个\(map<string,stirng>\)用来记录题目 ...
- 「Luogu P5602」小E与美食
题目链接 戳我 \(Solution\) 这道题只需要枚举吃\(k\)个美食,最后在取前\(k\)大的美味值.对于每个算出答案后取\(max\) \(Code\) #include<bits/s ...
- 「国家集训队」小Z的袜子
「国家集训队」小Z的袜子 传送门 莫队板子题. 注意计算答案的时候,由于分子分母都要除以2,所以可以直接约掉,这样在开桶算的时候也方便一些. 参考代码: #include <algorithm& ...
- Luogu P5603 小C与桌游【贪心+拓扑排序】
[Description]https://www.luogu.com.cn/problem/P5603 \(\;\) 题意可以简化为:一个不保证联通,n个点,m条边的DAG(有向无环图),构造一个拓扑 ...
- 「 Luogu P1231 」 教辅的组成
题目大意 有 $\text{N1}$ 本书 $\text{N2}$本练习册 $\text{N3}$本答案,一本书只能和一本练习册和一本答案配对.给你一些书和练习册,书和答案的可能的配对关系.问你最多可 ...
- 「Luogu 1525」关押罪犯
更好的阅读体验 Portal Portal1: Luogu Portal2: LibreOJ Description \(S\)城现有两座监狱,一共关押着\(N\)名罪犯,编号分别为\(1 - N\) ...
- 「 Luogu P2230 」X 「 Vijos 1142 」 HXOS系统
题目描述可能稍有偏差,但实质上是一样的. 看下面 题目大意 题面这么长,先说说题意吧. 就是有一个操作系统,他的存储方式是树形的.其中分为文件和目录(文件夹)每一个子目录下只能存储 $K$ 个文件或目 ...
- 「Luogu 2367」语文成绩
更好的阅读体验 Portal Portal1: Luogu Description 语文老师总是写错成绩,所以当她修改成绩的时候,总是累得不行.她总是要一遍遍地给某些同学增加分数,又要注意最低分是多少 ...
- 「Luogu 1821」[USACO07FEB]银牛派对Silver Cow Party
更好的阅读体验 Portal Portal1: Luogu Portal2: POJ Description One cow from each of N farms \((1 \le N \le 1 ...
随机推荐
- idea2019 Tomcat9 Tomcat Localhost log 乱码
网上一顿搜索,基本没用,可能版本不一样. idea2019 tomcat9解决方案: 找到Tomcat的安装目录,进入conf目录 打开logging.properties 找到java.util.l ...
- whistle学习(一)之安装、使用、软件功能了解
前言 whistle是基于Node实现的跨平台抓包调试代理工具,有以下基本功能: 查看HTTP.HTTPS请求响应内容 查看WebSocket.Socket收发的帧数据 设置请求hosts.上游htt ...
- javascript实现网页分享至朋友圈功能
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- 关于javascript的事件执行机制理解
理解javascript事件执行机制 众所周知,js是一个单线程的语言,这意味着同一时间只能做一件事,但是我们又说js是异步的.首先,单线程并不是没有优点.作为浏览器脚本语言,JavaScript 的 ...
- 1、CentOs安装
转载自:代码之美 0.准备工作: 一台没系统的普通电脑u盘一个(大于1G,最小安装的话不超过1G,根据选择系统大小匹配U盘即可)CentOS7.3 iso文件一个UltraISO工具 1.制作U盘 ① ...
- Vue异步请求最佳实践
一.当前存在的问题 目前项目前端请求后台数据的方式是这样的: 页面中method中dispatch到action action调用mutation,请求axios 请求到数据后存储到state中 页面 ...
- blucesun 解决npm报错:Module build failed: TypeError: this.getResolve is not a function
1.sass-loader的版本过高导致的编译错误,当前最高版本是8.x,需要退回到7.3.1 运行: npm uninstall sass-loader(卸载当前版本) npm install sa ...
- GridView 二维排布
与ListView一维排布相对 public class MainActivity extends Activity implements AdapterView.OnItemClickListene ...
- 5.Shell 流程控制语句
1.流程控制语句 通过if.for.while.case这4种流程控制语句来学习编写难度更大.功能更强的Shell脚本 4.3.1 if条件测试语句: if条件测试语句可以让脚本根据实际情况自动执行相 ...
- C++第二次作业--函数
1.为什么要用函数 创建 C++ 函数时,会定义函数做什么,然后通过调用函数来完成已定义的任务.通过函数我们可以实现代码复用,即可以重复使用和在各种适用情况下使用,函数的存在增强了程序的可读性.并且函 ...