传送门啦

这个题可以说是tarjan强连通分量的裸题,但需要维护每个强连通分量的最小值,所以做法就很明确了。

我们先明确几个数组的意思:

1.首先是tarjan缩点中的几个数组:

  dfn[i]:i点的时间戳

  low[i],表示这个点以及其子孙节点连的所有点中dfn最小的值

  stack[],表示当前所有可能能构成是强连通分量的点。

  ins[i],表示 i 是否在stack[ ]数组中

  num[i],表示第 i 个强连通分量中有多少个点

  belong[i],表示第 i 点在哪一个强连通分量里

2.然后是我们用来维护最小值以及最小 值个数的数组

  minn[i],表示第 i 个强连通分量中点权的最小值

  sum[]:表示最小值是 i 的有多少个

最最最需要注意的两初始化:

1.ans2 需要初始化为 1

2.minn[i]这个数组要初始为正无穷。

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
const long long mod = 1e9 + 7;
const int maxn = 1e5 + 5;
const int maxm = 3e5 + 4; int n,m,a[maxn],x,y;
struct Edge{
int to,next,val;
}edge[maxm << 1];
int head[maxn],tot;
int dfn[maxn],low[maxn],ind;
int stack[maxn],top,cnt,num[maxn],belong[maxn];
bool ins[maxn];
int ans1,ans2 = 1,minn[maxn],sum[maxn]; void add(int u,int v){
edge[++tot].to = v;
edge[tot].next = head[u];
head[u] = tot;
} inline int read(){
char ch = getchar();
int f = 1 , x = 0;
while(ch > '9' || ch < '0'){
if(ch == '-') f = -1;
ch = getchar();
}
while(ch <= '9' && ch >= '0'){
x = x * 10 + ch - '0';
ch = getchar();
}
return x * f;
} void print(int x){
if(x < 0){
putchar('-');
x = -x;
}
if(x > 9) print(x / 10);
putchar(x % 10 + '0');
} void tarjan(int x){
dfn[x] = low[x] = ++ind;
ins[x] = true;
stack[++top] = x;
for(int i=head[x];i;i=edge[i].next){
int v = edge[i].to;
if(ins[v]) low[x] = min(low[x] , dfn[v]);
if(!dfn[v]){
tarjan(v);
low[x] = min(low[x] , low[v]);
}
}
int k;
if(dfn[x] == low[x]){
++cnt;
do{
k = stack[top];
num[cnt]++;
ins[k] = false;
minn[cnt] = min(minn[cnt] , a[k]);
top--;
belong[k] = cnt;
} while(k != x);
}
} int main(){
n = read();
for(int i=1;i<=n;i++){
a[i] = read();
}
m = read();
for(int i=1;i<=m;i++){
x = read(); y = read();
add(x,y);
}
for(int i=1;i<=n;i++)
minn[i] = 1e9;
for(int i=1;i<=n;i++)
if(!dfn[i]) tarjan(i);
for(int i=1;i<=cnt;i++){
ans1 += minn[i];
}
print(ans1);
cout<<" ";
for(int i=1;i<=n;i++)
if(a[i] == minn[belong[i]])
sum[belong[i]]++;
for(int i=1;i<=cnt;i++)
ans2 = ans2 * sum[i] % mod;
print(ans2);
return 0;
}

洛谷P2194HXY烧情侣的更多相关文章

  1. 洛谷 P4931 - [MtOI2018]情侣?给我烧了!(加强版)(组合数学)

    洛谷题面传送门 A 了这道题+发这篇题解,就当过了这个七夕节吧 奇怪的过节方式又增加了 首先看到此题第一眼我们可以想到二项式反演,不过这个 \(T\) 组数据加上 \(5\times 10^6\) 的 ...

  2. 题解-洛谷4921&4931 情侣?给我烧了!(加不加强无所谓版)

    Problem 简单版 & 加强版 题目概要(其实题面写得很清楚,这里搬运一下): \(n\) 对情侣排座位,恰有 \(n\) 排座位,每排 \(2\) 个座位,在一个就座方案中所有人会将将座 ...

  3. 【洛谷P4931】 情侣?给我烧了!(加强版)组合计数

    挺有意思的一道题... code: #include <bits/stdc++.h> using namespace std; #define N 5000006 #define mod ...

  4. 洛谷 P2194 HXY烧情侣【Tarjan缩点】 分析+题解代码

    洛谷 P2194 HXY烧情侣[Tarjan缩点] 分析+题解代码 题目描述: 众所周知,HXY已经加入了FFF团.现在她要开始喜(sang)闻(xin)乐(bing)见(kuang)地烧情侣了.这里 ...

  5. 洛谷P2194 HXY烧情侣

    题目描述 众所周知,\(HXY\)已经加入了\(FFF\)团.现在她要开始喜\((sang)\)闻\((xin)\)乐\((bing)\)见\((kuang)\)地烧情侣了.这里有\(n\)座电影院, ...

  6. HXY烧情侣(洛谷 2194)

    题目描述 众所周知,HXY已经加入了FFF团.现在她要开始喜(sang)闻(xin)乐(bing)见(kuang)地烧情侣了.这里有n座电影院,n对情侣分别在每座电影院里,然后电影院里都有汽油,但是要 ...

  7. 洛谷 P1984 [SDOI2008]烧水问题

    洛谷 P1984 [SDOI2008]烧水问题 题目描述 把总质量为1kg的水分装在n个杯子里,每杯水的质量均为(1/n)kg,初始温度均为0℃.现需要把每一杯水都烧开.我们可以对任意一杯水进行加热. ...

  8. 洛谷1640 bzoj1854游戏 匈牙利就是又短又快

    bzoj炸了,靠离线版题目做了两道(过过样例什么的还是轻松的)但是交不了,正巧洛谷有个"大牛分站",就转回洛谷做题了 水题先行,一道傻逼匈牙利 其实本来的思路是搜索然后发现写出来类 ...

  9. 洛谷P1352 codevs1380 没有上司的舞会——S.B.S.

    没有上司的舞会  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond       题目描述 Description Ural大学有N个职员,编号为1~N.他们有 ...

随机推荐

  1. ListView嵌套webView 事件冲突解决

    如图,红色部分为WebView,作为ListView头部存在,测试视频(h5)要左右滑动,ListView要上下滑动,保证视频控件和下面评论部分可以显示,但是这个时候就存在WebView横向滑动和Li ...

  2. Android 捕获组合键

    android中捕获组合键http://blog.csdn.net/wenlibin1985/article/details/5579359 Android组合键http://www.eoeandro ...

  3. 把矩阵分成n*m个块,从任意一个块出发,问是否可以一笔画遍历矩阵中所有的块

  4. python 文件路径问题

    需要用到 os 模块和 sys 模块 import os print(__file__)# 输出相对路径 print(os.path.abspath(__file__)) #输出绝对路径 # D:\P ...

  5. NO.3day 网络基础

    网络基础 1.互联网协议 概念:通过互联网传输数据的标准. 功能:定义计算机如何接入internet,以及接入internet的计算机通信的标准. 2.OSI五层模型 应用层--传输层--网络层--数 ...

  6. getContentLength() 指为 -1 的解决办法

    在这个坑里3个多小时啊.这里不得不抱怨下,国内的资料坑爹,全部copy不说,还是错的. 解决办法: 在服务端加入代码: File file = new File(path); //path为要下载的文 ...

  7. java的灵魂——反射

    前言:当我们在类加载的时候,除了把.class文件加载到内存,会把各个类存到各个类模板(class类型)对象上,相同的类只有一个类模板对象.连接:把类的二进制数据合并到JRE中 反射运行时探究和使用编 ...

  8. [应用篇]第一篇 EL表达式入门

    概念 EL表达式:EL 全名为Expression Language,就是为了替代<%= %>脚本表达式. 作用 获取数据: EL表达式主要用于替换JSP页面中的脚本表达式,以从各种类型的 ...

  9. javascript精雕细琢(一):var let const function声明的区别

    目录 引言 一.var 二.let 三.const 四.function 五.总结 引言        在学习javascript的过程中,变量是无时无刻不在使用的.那么相对应的,变量声明方法也如是. ...

  10. python学习笔记2--list

    一.list操作 list=['xiaohei','xiaobai','xiaohong']#定义一个数组 name=[]#定义一个空数组 #查 #下标是从0开始 print(list[1]) #-1 ...