51Nod 1815 调查任务
发现绍一的人很喜欢做51nod,不得不说这还是一个很全能的良心OJ
但是做的这道题就一点都不良心了,简直是毒瘤,调了一早上
首先我们考虑让一条路径的\(a_x\ mod\ a_y\)的值最大,我们简单分析一波可以得出一个结论:
当\(a_x\)为这条路径上的严格次大数,且\(a_y\)为最大数时,答案最大,且答案为\(a_x\)。很显然吧,我来稍微证明一下:
设最大值为\(a_u\ mod\ a_v\),则
- 当\(a_v=a_y\)时,此时\(a_u\ mod\ a_v=a_u\),因此取出\(a_x\)更优
- 当\(a_v\ne a_y\)时,此时\(a_u\ mod\ a_v<a_v\),此时即使令\(a_v=max(a_i)=a_x\),亦有\(a_u\ mod\ a_v<a_x\)
然后我们有在题目中发现一条十分重要的信息:
一个点可以被经过多次!
因此一个联通块内的点都可以互相到达,因此我们进行Tarjan缩点,然后考虑拓扑排序更新出最大值最小值
但是注意一点,一个点只能从一个点转移过来,刚开始就是没有考虑到这一点然后WA到死
具体的操作比较麻烦,还是看一下CODE吧,解释一下里面关键的几个数组:
- max1[]:当前联通块内的最小值
- max2[]:当前联通块内的严格次小值
- max3[]:当前路径上的最小值
- max4[]:当前路径上的严格次小值
然后就是细节慢慢的转移了,尤其是注意我多次标注的严格
最后莫名在51nod上拿了Rank1,并且甩了Rank2的yekehe一截
CODE
#pragma G++ optimize (2)
#pragma comment(linker, "/STACK:10240000,10240000")
#include<cstdio>
#include<cctype>
#include<cstring>
using namespace std;
const int N=4e5+5,M=2e6+5;
struct edge
{
int to,next;
}e[M],ne[M];
int head[N],nhead[N],n,m,q,a[N],max1[N],max2[N],max3[N],max4[N],low[N],dfn[N],col[N],tot,scc,x,y,s,que[N],cnt,stack[N],top,ru[N];
bool vis[N];
inline char tc(void)
{
static char fl[100000],*A=fl,*B=fl;
return A==B&&(B=(A=fl)+fread(fl,1,100000,stdin),A==B)?EOF:*A++;
}
inline void read(int &x)
{
x=0; char ch; while (!isdigit(ch=tc()));
while (x=(x<<3)+(x<<1)+ch-'0',isdigit(ch=tc()));
}
inline void write(int x)
{
if (x>9) write(x/10);
putchar(x%10+'0');
}
inline void add(int x,int y)
{
e[++cnt].to=y; e[cnt].next=head[x]; head[x]=cnt;
}
inline void nadd(int x,int y)
{
ne[++cnt].to=y; ne[cnt].next=nhead[x]; nhead[x]=cnt;
}
inline int min(int a,int b)
{
return a<b?a:b;
}
inline int max(int a,int b)
{
return a>b?a:b;
}
inline void Tarjan(int now)
{
dfn[now]=low[now]=++tot; stack[++top]=now; vis[now]=1;
for (register int i=head[now];i!=-1;i=e[i].next)
if (!dfn[e[i].to]) Tarjan(e[i].to),low[now]=min(low[now],low[e[i].to]);
else if (vis[e[i].to]) low[now]=min(low[now],dfn[e[i].to]);
if (low[now]==dfn[now])
{
col[now]=++scc; vis[now]=0; max1[scc]=a[now];
while (stack[top]!=now)
{
col[stack[top]]=scc; vis[stack[top]]=0;
if (a[stack[top]]>max1[scc]) max2[scc]=max1[scc],max1[scc]=a[stack[top]];
else if (a[stack[top]]>max2[scc]&&a[stack[top]]!=max1[scc]) max2[scc]=a[stack[top]]; --top;
} --top;
}
}
inline void top_sort(int s)
{
int H=0,T=1; que[1]=s; vis[s]=1;
while (H<T)
{
int now=que[++H];
for (register int i=nhead[now];i!=-1;i=ne[i].next)
{
++ru[ne[i].to]; if (vis[ne[i].to]) continue;
vis[ne[i].to]=1; que[++T]=ne[i].to;
}
}
H=0; T=1; que[1]=s;
while (H<T)
{
int now=que[++H];
for (register int i=nhead[now];i!=-1;i=ne[i].next)
{
max2[ne[i].to]=max(max2[ne[i].to],max2[now]);
if (max1[ne[i].to]!=max3[now]) max2[ne[i].to]=max(max2[ne[i].to],min(max1[ne[i].to],max3[now]));
else max2[ne[i].to]=max(max2[ne[i].to],max4[now]);
if (max3[now]>max3[ne[i].to]) max4[ne[i].to]=max3[ne[i].to],max3[ne[i].to]=max3[now];
else if (max3[ne[i].to]>max3[now]&&max3[now]>max4[ne[i].to]) max4[ne[i].to]=max3[now];
if (max4[now]>max3[ne[i].to]) max4[ne[i].to]=max3[ne[i].to],max3[ne[i].to]=max4[ne[i].to];
else if (max3[ne[i].to]>max4[now]&&max4[now]>max4[ne[i].to]) max4[ne[i].to]=max4[now];
if (!(--ru[ne[i].to])) que[++T]=ne[i].to;
}
}
}
int main()
{
//freopen("CODE.in","r",stdin); freopen("CODE.out","w",stdout);
register int i,j; read(n); read(m); read(q); read(s);
memset(head,-1,sizeof(head)); memset(e,-1,sizeof(e));
memset(nhead,-1,sizeof(nhead)); memset(ne,-1,sizeof(ne));
for (i=1;i<=n;++i)
read(a[i]);
for (i=1;i<=m;++i)
read(x),read(y),add(x,y);
for (i=1;i<=n;++i)
if (!dfn[i]) Tarjan(i);
for (cnt=0,i=1;i<=n;++i)
for (j=head[i];j!=-1;j=e[j].next)
if (col[i]!=col[e[j].to]) nadd(col[i],col[e[j].to]);
memcpy(max3,max1,sizeof(max3)); memcpy(max4,max2,sizeof(max4)); top_sort(col[s]);
while (q--)
{
read(x); if (!vis[col[x]]) printf("-1 ");
else write(max2[col[x]]),putchar(' ');
}
return 0;
}
51Nod 1815 调查任务的更多相关文章
- 【51Nod 1815】【算法马拉松 23】调查任务
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1815 tarjan缩点后在DAG上递推即可. 每个点维护所有根到它的路径 ...
- *51nod 1815
从若干个数中选出最大的任意两数取模之后的结果 严格次大值 对于此题 首先缩点 然后拓扑排序 维护到达每个点的最大值与严格次大值 感觉思路与代码都OK啊 then.... #include <io ...
- 51nod图论题解(4级,5级算法题)
51nod图论题解(4级,5级算法题) 1805 小树 基准时间限制:1.5 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 她发现她的树的点上都有一个标号(从1到n),这些树都在空 ...
- 51nod 1494 选举拉票 | 线段树
51nod1494 选举拉票 题面 现在你要竞选一个县的县长.你去对每一个选民进行了调查.你已经知道每一个人要选的人是谁,以及要花多少钱才能让这个人选你.现在你想要花最少的钱使得你当上县长.你当选的条 ...
- O365(世纪互联)SharePoint 之调查列表简单介绍
前言 SharePoint中为了提供了很多开箱即用的应用程序,比如调查列表就是其中之一,同样,在O365版本里(国际版和世纪互联版本均可),也有这样的调查列表可以供我们使用,而使用起来非常方便和快速, ...
- Office 365使用情况调查不完全分析报告
感谢大家参与了9月13日在Office 365技术群(O萌)中发起的一个关于Office 365使用情况的调查,在一天左右的时间内,我们一共收到了67份反馈,其中绝大部分是在3分钟内提交的. 本次调查 ...
- 【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 活 ...
随机推荐
- 修改eclipse的背景色(转载)
eclipse操作界面默认颜色为白色.对于我们长期使用电脑编程的人来说,白色很刺激我们的眼睛,所以我经常会改变workspace的背景色,使眼睛舒服一些. 设置方法如下: 1.打开window-> ...
- Django基础篇--用户权限管理和组管理
Django作为一个成熟的python后台开发框架,为开发者提供了很多内置的功能,开发者只需要做一些配置就可以完成原生操作中比较复杂的代码编写.这些内置功能中其中一个比较强大的功能就是后台用户管理类. ...
- CSS页面布局常见问题总结
在前端开发中经常会碰到各种类型布局的网页,这要求我们对css网页布局非常熟悉.其中水平垂直居中布局,多列布局等经常会被使用到,今天就来解决一下css布局方面的问题. 水平垂直居中的几种方法 说到水平垂 ...
- 3.网络编程-tcp的服务器简单实现
#!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2019/1/13 22:03 # @Author : ChenAdong # @ema ...
- CGI,FastCGI,PHP-FPM,PHP-CLI,modPHP
This might give you a broader understanding of their difference: CGI: (common gateway interface) It ...
- python中常用函数整理
1.map map是python内置的高阶函数,它接收一个函数和一个列表,函数依次作用在列表的每个元素上,返回一个可迭代map对象. class map(object): ""&q ...
- 洗礼灵魂,修炼python(56)--爬虫篇—知识补充—编码之url编码
其实在最前面的某一篇博文里,是绝对提过编码的,有ASCII,有UTF-8,有GB2312等等,这些我绝对说过的. url编码 首先,Http协议中参数的传输是"key=value" ...
- Windows10 内存泄漏
之前遇到win10开机idle一段时间后, 内存噌噌的往上彪, 16G内存基本什么东西没开就90%多.查了网上的一些解决方案: 方法1. 关闭Ndu服务 sc config Ndu start=dis ...
- Linux小技巧之:两种方法统计访问web网站的前10个IP
获得访问前10位的IP地址: 10.46.170.7 218.202.70.147 77.72.83.87 5.39.217.107 185.197.74.234 185.197.74.231 第二种 ...
- IO流_演示键盘录入
读取一个键盘录入的数据,打印到控制台上 键盘本身就是一个标准的输入设备,对于java而言,对于这种输入设备都有相应的对象在System类中 import java.io.IOException; im ...