[luogu3573 POI2014] RAJ-Rally (拓扑排序 权值线段树)
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 (拓扑排序 权值线段树)的更多相关文章
- [bzoj3524==bzoj2223][Poi2014]Couriers/[Coci 2009]PATULJCI——主席树+权值线段树
题目大意 给定一个大小为n,每个数的大小均在[1,c]之间的数列,你需要回答m个询问,其中第i个询问形如\((l_i, r_i)\),你需要回答是否存在一个数使得它在区间\([l_i,r_i]\)中出 ...
- HDU-6704 K-th occurrence (后缀自动机father树上倍增建权值线段树合并)
layout: post title: HDU-6704 K-th occurrence (后缀自动机father树上倍增建权值线段树合并) author: "luowentaoaa&quo ...
- BZOJ_2161_布娃娃_权值线段树
BZOJ_2161_布娃娃_权值线段树 Description 小时候的雨荨非常听话,是父母眼中的好孩子.在学校是老师的左右手,同学的好榜样.后来她成为艾利斯顿第二 代考神,这和小时候培养的良好素质是 ...
- BZOJ_1503_[NOI2004]郁闷的出纳员_权值线段树
BZOJ_1503_[NOI2004]郁闷的出纳员_权值线段树 Description OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的 工资. ...
- cf1073G Yet Another LCP Problem (SA+权值线段树)
反正先求一遍sa 然后这个问题可以稍微转化一下 默认比较A.B数组中元素的大小都是比较它们rank的大小,毕竟两个位置的LCP就是它们rank的rmq 然后每次只要求B[j]>=A[i]的LCP ...
- HDU - 2665 Kth number 主席树/可持久化权值线段树
题意 给一个数列,一些询问,问$[l,r]$中第$K$大的元素是哪一个 题解: 写法很多,主席树是最常用的一种之一 除此之外有:划分树,莫队分块,平衡树等 主席树的定义其实挺模糊, 一般认为就是可持久 ...
- 2019.01.21 bzoj2441: [中山市选2011]小W的问题(树状数组+权值线段树)
传送门 数据结构优化计数菜题. 题意简述:给nnn个点问有多少个www型. www型的定义: 由5个不同的点组成,满足x1<x2<x3<x4<x5,x3>x1>x2 ...
- bzoj 1503: [NOI2004]郁闷的出纳员 -- 权值线段树
1503: [NOI2004]郁闷的出纳员 Time Limit: 5 Sec Memory Limit: 64 MB Description OIER公司是一家大型专业化软件公司,有着数以万计的员 ...
- 【bzoj2161】布娃娃 权值线段树
题目描述 小时候的雨荨非常听话,是父母眼中的好孩子.在学校是老师的左右手,同学的好榜样.后来她成为艾利斯顿第二代考神,这和小时候培养的良好素质是分不开的.雨荨的妈妈也为有这么一个懂事的女儿感到高兴.一 ...
随机推荐
- Error处理: android.media.MediaRecorder.start(Native Method) 报错:start failed: -19【转】
本文转载自:http://blog.csdn.net/netwalk/article/details/17686993 Error处理: android.media.MediaRecorder.sta ...
- KVPhone,VOS官方的SIP软电话电脑客户端
来自官方,品质纯正.但是可能因为JAVA环境等问题无法安装,可以试试! 下载地址: 解压密码:www.51voip.org
- Linux 系统管理命令 - lsof - 查看进程打开的文件
命令详解 重要星级: ★★★★★ 功能说明: 全名为 list open files,也就是列举系统中已经被打开的文件,通过 lsof 命令,就可以根据文件找到对应的进程信息,也可以根据进程信息找到进 ...
- EntityFramework:An error occurred while executing the command definition. See the inner exception for details.
错误描述: 调用EF中的FirstOrDefault()时,报错误:An error occurred while executing the command definition. See the ...
- nat模式下更改网络环境, 虚拟机中Linux无法上网的问题
出现的问题: 1.ifconfig -a 命令下会出现eth0信息中无ip地址等等信息: 2.无法ping通baidu,也就是无法上网: 3.ping 8.8.8.8 提示 connect:netwo ...
- C++小项目-吃豆子游戏
GMap.h #pragma once //保证头文件只被编译一次 #include "stdafx.h" #define MAP_LEN 19 //逻辑地图大小 (逻辑地图由行. ...
- Previous operation has not finished; run 'cleanup' if it was interrupted.SVN报错
原因: 错误的原因是SVN管理的文件夹改名.删除文件太过频繁,导致有操作挂起了. 解决方式: 1.百度sqlite3.exe并下载. 2.将该文件解压到项目根目录下的.svn文件夹中. 3.打开cmd ...
- (2)左右值初探与auto类型说明符
这篇文章的起因是下面这两段代码,出自<C++ primer 5th>中文版P62页: auto &h =42;//错误,不能为非常量引用绑定字面值 const auto & ...
- TypeError: slice indices must be integers or None or have an __index__ method
由于除法/自动产生的类型是浮点型,因此出现上述错误,修正方法为,将/更改为// roi_gray_lwpCV = gray_lwpCV[y:y + h // 2, x:x + w] # 检出人脸区域后 ...
- v形 加强版
<!doctype html><html><head><meta charset="utf-8"><title>无标题文 ...