*51nod 1815
从若干个数中选出最大的任意两数取模之后的结果
严格次大值
对于此题
首先缩点
然后拓扑排序
维护到达每个点的最大值与严格次大值
感觉思路与代码都OK啊
then....
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <string>
#include <queue>
#include <ctime> using namespace std; #define LL long long #define gc getchar()
inline int read() {int x = ; char c = gc; while(c < '' || c > '') c = gc;
while(c >= '' && c <= '') x = x * + c - '', c = gc; return x;}
inline LL read_LL() {LL x = ; char c = gc; while(c < '' || c > '') c = gc;
while(c >= '' && c <= '') x = x * + c - '', c = gc; return x;}
#undef gc const int N = 4e5 + , M = 2e6 + ;
int n, m, S, Q;
int A[N]; int Dfn[N], Low[N], Belong[N], Beljs, Tim;
bool vis[N];
int Stack[N], topp; pair <int, int> Pair[N];
struct Node {int u, v, nxt;} G[M];
int head1[N], cnt; inline void Link(int u, int v) {G[++ cnt].v = v; G[cnt].nxt = head1[u]; head1[u] = cnt;} void Tarjan(int u) {
Dfn[u] = Low[u] = ++ Tim;
vis[u] = ;
Stack[++ topp] = u;
for(int i = head1[u]; ~ i; i = G[i].nxt) {
int v = G[i].v;
if(!Dfn[v]) {
Tarjan(v);
Low[u] = min(Low[u], Low[v]);
} else if(vis[v]) Low[u] = min(Low[u], Low[v]);
}
if(Low[u] == Dfn[u]) {
int Max = , CMax = ;
Max = A[u];
vis[u] = ; Belong[u] = ++ Beljs;
Pair[Beljs].first = A[u]; Pair[Beljs].second = -;
while(Stack[topp] != u) {
int a = Stack[topp];
vis[a] = ;
Belong[a] = Beljs;
topp --;
if(A[a] > Max) {CMax = Max, Max = A[a];}
else if(A[a] != Max) CMax = max(CMax, A[a]);
Pair[Beljs] = make_pair(Max, CMax);
} topp --;
}
} Node E[M];
int head2[N], Du[N]; inline void ReLink(int u, int v) {Du[v] ++; E[++ cnt].v = v; E[cnt].nxt = head2[u]; head2[u] = cnt;} int use[N]; void Rebuild() {
for(int i = ; i <= Beljs; i ++) head2[i] = -;
cnt = ;
for(int u = ; u <= n; u ++)
for(int i = head1[u]; ~ i; i = G[i].nxt) {
int v = G[i].v;
if(Belong[u] != Belong[v] && use[Belong[v]] != u) {
use[Belong[v]] = u;
// cout << Belong[u] << " " << Belong[v] << "\n";
ReLink(Belong[u], Belong[v]);
}
}
} int Que[N]; bool beuse[N]; void Topsort() {
int h = , t = ;
// for(int i = 1; i <= Beljs; i ++) if(Du[i] == 0) Que[++ t] = i;
Que[++ t] = Belong[S];
while(h <= t) {
int topu = Que[h ++];
beuse[topu] = ;
for(int i = head2[topu]; ~ i; i = E[i].nxt) {
int v = E[i].v;
Du[v] --;
if(Du[v] == ) Que[++ t] = v;
int B[];
// cout << Pair[topu].first << " " << Pair[topu].second << " " << Pair[v].first << " " << Pair[v].second << "\n";
B[] = Pair[topu].first, B[] = Pair[topu].second, B[] = Pair[v].first, B[] = Pair[v].second;
sort(B + , B + );
Pair[v].first = B[];
int j = ;
while(B[j] == B[]) j --;
Pair[v].second = B[j];
}
}
} int main() {
// srand(time(0) - 99999);
// freopen("gg.in", "r", stdin);
// freopen("gg.out", "w", stdout);
n = read(), m = read(), Q = read(), S = read();
for(int i = ; i <= n; i ++) A[i] = read();
for(int i = ; i <= n; i ++) head1[i] = -;
for(int i = ; i <= m; i ++) {
int u = read(), v = read();
Link(u, v);
}
for(int i = ; i <= n; i ++)
if(!Dfn[i])
Tarjan(i);
// for(int i = 1; i <= Beljs; i ++) {
// cout << Pair[i].first << " " << Pair[i].second << "\n";
// }
// return 0;
Rebuild();
// for(int i = 1; i <= Beljs; i ++) {
// for(int j = head2[i]; ~ j; j = E[j].nxt) {
// int v = E[j].v;
// cout << i << " " << v << "\n";
// }
// }
Topsort();
for(int i = ; i <= Q; i ++) {
int a = read();
if(beuse[Belong[a]] == ) cout << - << " ";
else cout << Pair[Belong[a]].second << " ";
// if(ans == 0) cout << -1 << " ";
// cout << ans << " ";
}
return ;
}
/*
8 10 5 1
5 5 5 7 5 5 5 5
1 2
2 3
3 1
3 4
5 1
6 5
1 6
6 8
8 7
7 6
1 2 3 4 5
*/
*51nod 1815的更多相关文章
- 【51Nod 1815】【算法马拉松 23】调查任务
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1815 tarjan缩点后在DAG上递推即可. 每个点维护所有根到它的路径 ...
- 51Nod 1815 调查任务
发现绍一的人很喜欢做51nod,不得不说这还是一个很全能的良心OJ 但是做的这道题就一点都不良心了,简直是毒瘤,调了一早上 首先我们考虑让一条路径的\(a_x\ mod\ a_y\)的值最大,我们简单 ...
- 51nod图论题解(4级,5级算法题)
51nod图论题解(4级,5级算法题) 1805 小树 基准时间限制:1.5 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 她发现她的树的点上都有一个标号(从1到n),这些树都在空 ...
- 【51Nod 1244】莫比乌斯函数之和
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1244 模板题... 杜教筛和基于质因子分解的筛法都写了一下模板. 杜教筛 ...
- 51Nod 1268 和为K的组合
51Nod 1268 和为K的组合 1268 和为K的组合 基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题 给出N个正整数组成的数组A,求能否从中选出若干个,使 ...
- 51Nod 1428 活动安排问题
51Nod 1428 活动安排问题 Link: http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1428 1428 活 ...
- 51Nod 1278 相离的圆
51Nod 1278 相离的圆 Link: http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1278 1278 相离的圆 基 ...
- 【51Nod 1501】【算法马拉松 19D】石头剪刀布威力加强版
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1501 dp求出环状不连续的前缀和,剩下东西都可以算出来,比较繁琐. 时间 ...
- 【51Nod 1622】【算法马拉松 19C】集合对
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1622 简单题..直接暴力快速幂 #include<cstdio&g ...
随机推荐
- go http简单的表单处理
//表单处理 package main import ( "net/http" "io" "fmt" &qu ...
- [PKUSC2018]主斗地(搜索+贪心)
首先如果对子和三张牌出现在解中,那么全拆成单张显然没有问题,顺子同理.于是真正有用的牌型就只有单牌.三带一.三带二.四带二了. 暴搜jry手中的牌,然后先搜出双方的大牌型(即三张.四张牌的个数),再枚 ...
- hystrix配置
一.hystrix在生产中的建议 1.保持timeout的默认值(1000ms),除非需要修改(其实通常会修改) 2.保持threadpool的的线程数为10个,除非需要更多 3.依赖标准的报警和监控 ...
- ES6中 对字符串增强
在曾经,我们只能用A.indexof(B)来判断A中是否含有B字符串: 现在在ES6中 有了: includes(), startswith(),endswith() reapt()重复次数: 输出 ...
- JavaScript作用域、作用域链 学习随笔
(本文是这些知识点的自我理解.写之余从头回顾,加深理解.取得更多收获之用.) 作用域(scope) 程序设计概念,通常来说,一段程序代码中所用到的名字(JS叫标识符(如变量名.函数名.属性名.参数.. ...
- ios获取数组中的最大值
在编码过程中,我们通常碰到一组数据,需要自己简单的处理下,拿到数组中的总和,大小和平均值数据. 1.简单粗暴的方法,快速求和. NSArray * array = @[@"35", ...
- 2019.9.27,SAP成都研究院数字创新空间团队建设,射箭和游泳
2019年9月27日,秋高气爽,SAP成都研究院数字创新团队全体成员又迎来了一次团队建设活动.这次的主题是:射箭. 在正式活动之前,大家先享用了一顿泰式海鲜火锅: 吃饱喝足之后,我们来到了名为&quo ...
- git命令——git add
如何理解git add git add命令本身并不复杂,字面意义上理解是“将一个文件添加到项目中“.但是这种理解有缺陷,有时候可能会出现某个文件同时存在暂存区域 和 非暂存区域(staged and ...
- 【OF框架】在Azure DevOps中配置项目持续集成CI服务,推送镜像到Azure容器注册表
准备工作 开通Azure账号,具有开通服务权限,关键是里面要有钱. 开通Azure DevOps,能够创建组织和项目. 具备一定的DevOps知识,了解CICD概念.Docker基本操作. 一.创建& ...
- 《阿里巴巴编码规范(JAVA)》认证考后感
2018.02.15除夕拿下了阿里云认证的<阿里巴巴编码规范(JAVA)>认证,写下这篇考后感,记录考试中碰到的一些考点. 先总体介绍下这个考试规则,50道选择题,大部分是多选题,有少部分 ...