BZOJ3832Rally题解
一道思维神题....
我们像网络流一样加入原点S,与汇点T
用f[i]表示原点到i的最长路,用g[i]表示i到汇点的最长路
f数组与g数组都可以dp求出来的
接下来考虑如何通过这些信息来维护删除某个点的最长路
用拓扑序来删点
我们先将所有g数组加入一个集合中,
每次删点是就先将所有该点的入边的点的f[i]+g[x]从集合中删掉
然后此时集合中最大值就是删除这个点的最优解
然后再将每个点的出边i的f[x]+g[i]加入集合中
可以发现这个集合可以用堆来维护
# include<iostream>
# include<cstdio>
# include<cmath>
# include<cstring>
# include<algorithm>
# include<queue>
using namespace std;
const int mn = ;
struct Grap{
struct edge{int to,next;};
edge e[mn*];
int head[mn],edge_max;
void add(int x,int y)
{
e[++edge_max].to=y;
e[edge_max].next=head[x];
head[x]=edge_max;
}
}A,B;
int deg[mn*],n,m,a[mn*];
int f[mn*],g[mn*];
void topolpgy()
{
int tail=,head=;
for(int i=;i<=n;i++)
if(!deg[i]) a[++head]=i;
//printf("%d %d\n",tail,head);
while(tail<=head)
{
int u=a[tail];
tail++;
for(int i=A.head[u];i;i=A.e[i].next)
{
deg[A.e[i].to]--;
if(!deg[A.e[i].to]) a[++head]=A.e[i].to;
}
}
}
struct Heap{
int heap[mn*],mark[mn*],top;
void ins(int x)
{
if(mark[x])
{
--mark[x];
return ;
}
heap[++top]=x;
int t=top;
while(t>)
{
if(heap[t]>heap[t>>])
swap(heap[t],heap[t>>]),t>>=;
else
break;
}
}
void del(int x)
{
mark[x]++;
}
void Pop()
{
heap[]=heap[top--];
int t=;
while(t<=top)
{
if( t<top && heap[t+]>heap[t] )
t++;
if(heap[t]>heap[t>>])
swap(heap[t],heap[t>>]),t<<=;
else
break;
}
}
int Top()
{
while(mark[heap[]])
mark[heap[]]--,Pop();
return heap[];
}
}T;
int main()
{
int x,y;
A.edge_max=,B.edge_max=;
scanf("%d%d",&n,&m);
for(int i=;i<=m;i++)
{
scanf("%d%d",&x,&y);
A.add(x,y),B.add(y,x);
deg[y]++;
}
topolpgy();
/*for(int i=1;i<=n;i++)
printf("%d ",a[i]);*/
int ans=,ans_len=0x3f3f3f3f;
for(int i=;i<=n;i++)
{
int u=a[i];
f[u]=max(f[u],);
for(int j=A.head[u];j;j=A.e[j].next)
f[A.e[j].to]=max(f[A.e[j].to],f[u]+);
}
for(int i=n;i>=;i--)
{
int u=a[i];
g[u]=max(g[u],);
for(int j=A.head[u];j;j=A.e[j].next)
g[u]=max(g[u],g[A.e[j].to]+);
}
/*for(int i=1;i<=n;i++)
printf("%d:%d %d\n",i,f[i],g[i]);*/
for(int i=;i<=n;i++)
T.ins(g[i]);
T.ins();
for(int i=;i<=n;i++)
{
int u=a[i];
for(int j=B.head[u];j;j=B.e[j].next)
{
T.del(f[B.e[j].to]+g[u]);
//printf("%d ",f[B.e[j].to]+g[u]);
}
//printf("\n");
T.del(g[u]);
if(T.Top()<ans_len)
{
ans_len=T.Top(),ans=u;
//printf("%d ",T.Top());
}
for(int j=A.head[u];j;j=A.e[j].next)
{
T.ins(f[u]+g[A.e[j].to]);
//printf("%d ",f[u]+g[B.e[j].to]);
}
T.ins(f[u]);
//printf("%d\n",ans_len-1);
}
printf("%d %d",ans,ans_len-);
return ;
}
BZOJ3832Rally题解的更多相关文章
- 2016 华南师大ACM校赛 SCNUCPC 非官方题解
我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...
- noip2016十连测题解
以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...
- BZOJ-2561-最小生成树 题解(最小割)
2561: 最小生成树(题解) Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1628 Solved: 786 传送门:http://www.lyd ...
- Codeforces Round #353 (Div. 2) ABCDE 题解 python
Problems # Name A Infinite Sequence standard input/output 1 s, 256 MB x3509 B Restoring P ...
- 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解
题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...
- 2016ACM青岛区域赛题解
A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Jav ...
- poj1399 hoj1037 Direct Visibility 题解 (宽搜)
http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ...
- 网络流n题 题解
学会了网络流,就经常闲的没事儿刷网络流--于是乎来一发题解. 1. COGS2093 花园的守护之神 题意:给定一个带权无向图,问至少删除多少条边才能使得s-t最短路的长度变长. 用Dijkstra或 ...
- CF100965C题解..
求方程 \[ \begin{array}\\ \sum_{i=1}^n x_i & \equiv & a_1 \pmod{p} \\ \sum_{i=1}^n x_i^2 & ...
随机推荐
- XSS“从1到0”
时隔半年终于也应该更新了,之前说的每周更新也因为懒散这个借口变得遥遥无期.之所以叫这个标题,是在Freebuf上看到一篇文章,开头作者问到:“网上大多的文章标题都是XXX从0开始,可我们到底什么时候能 ...
- 2019-7-15-win10-uwp-在笔迹开始书写拿到书写移动事件
title author date CreateTime categories win10 uwp 在笔迹开始书写拿到书写移动事件 lindexi 2019-7-15 8:58:5 +0800 201 ...
- Odoo 中的widget
many2many_tags one2many_list selection progressbar selection statusbar handle monetary mail_thread s ...
- [Array]268. Missing Number
Given an array containing n distinct numbers taken from 0, 1, 2, ..., n, find the one that is missin ...
- [转]了解screen对象的常用视图属性
前面的话 screen对象基本上只用来表明客户端的能力,其中包括浏览器窗口外部的显示器的信息,如像素高度和宽度等.每个浏览器中的screen对象都包含着各不相同的属性.本文将详细介绍screen对象的 ...
- 傳説中的 jsonp
jsonp的由來 1 . 網頁上的東西衹要跨域了就不能傳送或者接受數據了.不管是什麽衹要是跨域.Ajax直接请求普通文件存在跨域无权限访问的问题, 2 . 但是src這個東西比較厲害了,請求哪裏都可以 ...
- Django 创建web项目之HelloWorld
Django.Flask.Tornado并称为python WEB三大框架.Diango是一个开源的web应用框架,具有开发速度快的特点.同时因为过度封装,具有性能低的特点. 创建Django项目,启 ...
- linux如何将分组权限置为空
两种方法 方法一:使用-符号 chmod g=- monkey.py#可以单独指定一个 方法二:简写方式,用0表示 chmod 740 monkey.py#必须同时指定三个的权限
- 关于neo4j的嵌入式和驱动包模式该如何选择,还请解惑
看了网上的一些资料和Neo4j权威指南这本书.与图遍历相关的介绍都是基于嵌入式模式下的java Api.但是个人觉得在实际的项目中,嵌入式的模式,代码必须放在数据库所在服务器上,且服务器的启停操作都在 ...
- HTML5属性
HTML5同时增加和废除了很多属性.下面介绍一些常用的属性. 1.表单属性 为input(type=text).select.textarea与button元素新增了autofocus属性.(它以指定 ...