传送门

Solution

在DAG中我们可以\(O(n)\)预处理\(Ds(u)\)表示从u表示以s为起点的最长路\(Dt(u)\)表示以u为终点的最长路,那么经过\((u,v)\)的最长路即为\(Dt(u)+Ds(t)+1\)

然后我们考虑如何快速枚举删哪个点来统计答案

emmm。。。懒得画图了,后面的去看这篇博客吧

Code

//By Menteur_Hxy
#include <cmath>
#include <vector>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#define Re register
#define ls nd[cur][0]
#define rs nd[cur][1]
#define Ms(a,b) memset(a,(b),sizeof(a))
#define Ee(i,u) for(Re int i=head[u];i;i=nxt[i])
#define Fo(i,a,b) for(Re int i=(a),_=(b);i<=_;i++)
#define Ro(i,a,b) for(Re int i=(b),_=(a);i>=_;i--)
using namespace std; inline int read() {
int x=0,f=1;char c=getchar();
while(!isdigit(c)) {if(c=='-')f=-f;c=getchar();}
while(isdigit(c)) x=(x<<1)+(x<<3)+c-48,c=getchar();
return x*f;
} const int N=10e5+10,M=2e6+10,INF=0x3f3f3f3f;
int n,m,cnt,ans=INF,aid;
int ind[N],nxt[M],to[M],head[N],que[N],ds[N],dt[N];
vector<int> V[N]; void add(int u,int v) {nxt[++cnt]=head[u],to[cnt]=v,head[u]=cnt;} void Tsort() {
int h=1,t=0;
Fo(i,1,n) if(!ind[i]) que[++t]=i;
while(h<=t) {
int u=que[h++],v;
Ee(i,u) if(!(--ind[v=(to[i])])) que[++t]=v;
}
} void pre_work() {
Tsort();
Ro(i,1,n) {
int u=que[i],siz=V[u].size(),v;
Fo(j,0,siz-1) v=V[u][j],ds[v]=max(ds[v],ds[u]+1);
}
Fo(i,1,n) {
int u=que[i],v;
Ee(j,u) v=to[j],dt[v]=max(dt[v],dt[u]+1);
}
} struct SMT{
int nd[N<<2][2],sum[N<<2],tot,root;
void clear() {Ms(nd,0);Ms(sum,0);tot=root=0;}
void upd(int l,int r,int &cur,int k,int d) {
if(!cur) cur=++tot;
if(l==r) {sum[cur]+=d;return ;}
int mid=(l+r)>>1;
if(k<=mid) upd(l,mid,ls,k,d);
else upd(mid+1,r,rs,k,d);
sum[cur]=sum[ls]+sum[rs];
}
int qry(int l,int r,int cur) {
if(l==r) return l;
int mid=(l+r)>>1;
if(sum[rs]) return qry(mid+1,r,rs);
else return qry(l,mid,ls);
}
}T; void solve() {
T.clear();
Fo(i,1,n) T.upd(0,n,T.root,ds[i],1);
Fo(i,1,n) {
int u=que[i],siz=V[u].size();
T.upd(0,n,T.root,ds[u],-1);
Fo(j,0,siz-1) T.upd(0,n,T.root,dt[V[u][j]]+ds[u]+1,-1);
int tmp=T.qry(0,n,T.root); if(tmp<ans) ans=tmp,aid=u;
T.upd(0,n,T.root,dt[u],1);
Ee(j,u) T.upd(0,n,T.root,dt[u]+ds[to[j]]+1,1);
}
printf("%d %d",aid,ans);
} int main() {
n=read();m=read();
Fo(i,1,m) {
int u=read(),v=read();
add(u,v); ind[v]++;
V[v].push_back(u);
}
pre_work(); solve();
return 0;
}

[luogu3573 POI2014] RAJ-Rally (拓扑排序 权值线段树)的更多相关文章

  1. [bzoj3524==bzoj2223][Poi2014]Couriers/[Coci 2009]PATULJCI——主席树+权值线段树

    题目大意 给定一个大小为n,每个数的大小均在[1,c]之间的数列,你需要回答m个询问,其中第i个询问形如\((l_i, r_i)\),你需要回答是否存在一个数使得它在区间\([l_i,r_i]\)中出 ...

  2. HDU-6704 K-th occurrence (后缀自动机father树上倍增建权值线段树合并)

    layout: post title: HDU-6704 K-th occurrence (后缀自动机father树上倍增建权值线段树合并) author: "luowentaoaa&quo ...

  3. BZOJ_2161_布娃娃_权值线段树

    BZOJ_2161_布娃娃_权值线段树 Description 小时候的雨荨非常听话,是父母眼中的好孩子.在学校是老师的左右手,同学的好榜样.后来她成为艾利斯顿第二 代考神,这和小时候培养的良好素质是 ...

  4. BZOJ_1503_[NOI2004]郁闷的出纳员_权值线段树

    BZOJ_1503_[NOI2004]郁闷的出纳员_权值线段树 Description OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的 工资. ...

  5. cf1073G Yet Another LCP Problem (SA+权值线段树)

    反正先求一遍sa 然后这个问题可以稍微转化一下 默认比较A.B数组中元素的大小都是比较它们rank的大小,毕竟两个位置的LCP就是它们rank的rmq 然后每次只要求B[j]>=A[i]的LCP ...

  6. HDU - 2665 Kth number 主席树/可持久化权值线段树

    题意 给一个数列,一些询问,问$[l,r]$中第$K$大的元素是哪一个 题解: 写法很多,主席树是最常用的一种之一 除此之外有:划分树,莫队分块,平衡树等 主席树的定义其实挺模糊, 一般认为就是可持久 ...

  7. 2019.01.21 bzoj2441: [中山市选2011]小W的问题(树状数组+权值线段树)

    传送门 数据结构优化计数菜题. 题意简述:给nnn个点问有多少个www型. www型的定义: 由5个不同的点组成,满足x1<x2<x3<x4<x5,x3>x1>x2 ...

  8. bzoj 1503: [NOI2004]郁闷的出纳员 -- 权值线段树

    1503: [NOI2004]郁闷的出纳员 Time Limit: 5 Sec  Memory Limit: 64 MB Description OIER公司是一家大型专业化软件公司,有着数以万计的员 ...

  9. 【bzoj2161】布娃娃 权值线段树

    题目描述 小时候的雨荨非常听话,是父母眼中的好孩子.在学校是老师的左右手,同学的好榜样.后来她成为艾利斯顿第二代考神,这和小时候培养的良好素质是分不开的.雨荨的妈妈也为有这么一个懂事的女儿感到高兴.一 ...

随机推荐

  1. iOS 开发 公司开发者账号,在多台Mac上合作开发,共用一个账号和证书--图文详解

    参考 导出证书申请的MAC里的Xcode的开发者账号 .developerprofile 导出的开发者账号文件.developerprofile 导出PKCS12既是.p12文件 所拷贝的资料, .d ...

  2. Silverlight调用WCF(1)

    [置顶] Silverlight调用WCF(1) 分类: 技术2012-03-31 12:29 940人阅读 评论(0) 收藏 举报 wcfsilverlightexceptionusersecuri ...

  3. 今晚的两道 bc

    第一道题  Beautiful Palindrome Number ,简单组合计数问题,手算打表就好~大概十五分钟左右搞定[第一次 提交竟然 wa了一次 有一个小小的坑在那.... /******** ...

  4. 【Codevs 1376】帕秋莉•诺蕾姬

    http://codevs.cn/problem/1376/ 枚举修改哪两位,将sum减去之前位置的数+交换之后  %m==0即可 预处理26的次方+O(n^2) // <1376.cpp> ...

  5. 【T^T 1871】获取敌情

    获取敌情 在公元4484年,人类展开了对外界星球的征途和探索,但也不可避免的展开了和外星人之间的战争.偶然的机遇之下,美国联邦调查局截获了一串来自外星球的信息.但不知道有什么特殊的意义.所以就委托你, ...

  6. 牛客网9.9比赛 C 保护

    题目大意: n个城市构成一个树 m支军队 每只军队守卫 在xi到yi的最短路径上的城市 q个重要人物从vi出发 找到离根最近的点使从vi到这个点上所有路径都可以被至少ki个军队完全覆盖 输出每个答案的 ...

  7. 4.7.3 Canonical LR(1) Parsing Tables

    4.7.3 Canonical LR(1) Parsing Tables We now give the rules for constructing the LR(1) ACTION and GOT ...

  8. 洛谷 P1573 栈的操作

    题目描述 现在有四个栈,其中前三个为空,第四个栈从栈顶到栈底分别为1,2,3,-,n.每一个栈只支持一种操作:弹出并压入.它指的是把其中一个栈A的栈顶元素x弹出,并马上压入任意一个栈B中.但是这样的操 ...

  9. mipi差分信号原理

    差分信号,什么是差分信号 一个差分信号是用一个数值来表示两个物理量之间的差异.从严格意义上来讲,所有电压信号都是差分的,因为一个电压只能是相对于另一个电压而言的.在某些系统里,系统’地’被用作电压基准 ...

  10. KeepAlived的实现示例

    KeepAlived的实现示例 KeepAlived的实现 HA Cluster配置准备: 各节点时间必须同步 ntp(6), chrony(7) 1>在centos6上 ntpdate 172 ...