从若干个数中选出最大的任意两数取模之后的结果

严格次大值

对于此题

首先缩点

然后拓扑排序

维护到达每个点的最大值与严格次大值

感觉思路与代码都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的更多相关文章

  1. 【51Nod 1815】【算法马拉松 23】调查任务

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1815 tarjan缩点后在DAG上递推即可. 每个点维护所有根到它的路径 ...

  2. 51Nod 1815 调查任务

    发现绍一的人很喜欢做51nod,不得不说这还是一个很全能的良心OJ 但是做的这道题就一点都不良心了,简直是毒瘤,调了一早上 首先我们考虑让一条路径的\(a_x\ mod\ a_y\)的值最大,我们简单 ...

  3. 51nod图论题解(4级,5级算法题)

    51nod图论题解(4级,5级算法题) 1805 小树 基准时间限制:1.5 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 她发现她的树的点上都有一个标号(从1到n),这些树都在空 ...

  4. 【51Nod 1244】莫比乌斯函数之和

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1244 模板题... 杜教筛和基于质因子分解的筛法都写了一下模板. 杜教筛 ...

  5. 51Nod 1268 和为K的组合

    51Nod  1268  和为K的组合 1268 和为K的组合 基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题 给出N个正整数组成的数组A,求能否从中选出若干个,使 ...

  6. 51Nod 1428 活动安排问题

    51Nod   1428  活动安排问题 Link: http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1428 1428 活 ...

  7. 51Nod 1278 相离的圆

    51Nod 1278 相离的圆 Link: http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1278 1278 相离的圆 基 ...

  8. 【51Nod 1501】【算法马拉松 19D】石头剪刀布威力加强版

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1501 dp求出环状不连续的前缀和,剩下东西都可以算出来,比较繁琐. 时间 ...

  9. 【51Nod 1622】【算法马拉松 19C】集合对

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1622 简单题..直接暴力快速幂 #include<cstdio&g ...

随机推荐

  1. PB笔记之数据窗口大小自适应的方式

    1.在OPEN 事件中设置数据窗口大小属性 tab_1.tabpage_6.dw_6.x=0tab_1.tabpage_6.dw_6.y=0tab_1.tabpage_6.dw_6.width=thi ...

  2. C/C++ cmake example

    学习 Golang,有时需要 Cgo,所以需要学习 C.C++. 语言入门: https://item.jd.com/12580612.html https://item.jd.com/2832653 ...

  3. Gogs + Drone 实现CI/CD(CD)

    前文已经实现CI部分,本文继续以Asp.Net Core实现CD部分. 创建gogs仓库 首先在gogs创建一个空项目drone-ci-demo,本地新建一个asp.net core项目,并且在与.c ...

  4. The version of SOS does not match the version of CLR you are debugging

    分析dump文件时,由于客户生产环境与分析dump文件的环境不一致,常常会出现下面的错误 The version of SOS does not match the version of CLR yo ...

  5. zabbix推送内存监控单应用shell

    利用top方式获取指定第三方的内存使用率 #!/bin/bash process=$1 if [ ! -z $process ];then cd /zabbix/zabbix-agent/script ...

  6. 通过DB13备份SystemDB

    配置systemdb capital user name:SYSTEM save -back Save 现在可以通过DB13备份SystemDB Done. Congratulations!

  7. Nginx 安装 和 特性介绍

    一:nginx 环境搭建 四项确认 确认系统网络可通行 确认yum可用 确认关闭iptables规则 确认停用selinux 查看iptables规则 iptables -L 关闭iptables规则 ...

  8. Apache基于域名、端口、IP的虚拟主机配置(Centos 6.5)

    虚拟主机:部署多个站点,每个站点,希望用不同的域名和站点目录,或者是不同的端口,不同的ip,需要虚拟主机功能.一句话,一个http服务要配置多个站点,就需要虚拟主机. 虚拟主机分类:基于域名.基于端口 ...

  9. 【异常】jps6432 -- process information unavailable

    1 现象

  10. TLS握手秘钥套件分析

    1.为了弄清楚TLS1.3的内部结构,觉得有必要将TLS的整个结构从新整理一遍,方便后续在做握手协议的形式化分析的时候能够不遗漏每个加密和认证的的环节. TLS1.3不论文在协议内容上还是性能上都较之 ...