[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】布娃娃 权值线段树
题目描述 小时候的雨荨非常听话,是父母眼中的好孩子.在学校是老师的左右手,同学的好榜样.后来她成为艾利斯顿第二代考神,这和小时候培养的良好素质是分不开的.雨荨的妈妈也为有这么一个懂事的女儿感到高兴.一 ...
随机推荐
- mysql与mongoDB的特点和优劣
首先分析下mysql与mongoDB的特点和优劣 从图中分析: 再来分析下应用场景: a.如果需要将mongodb作为后端db来代替mysql使用,即这里mysql与mongodb 属于平行级别,那么 ...
- android 在代码中设置字体颜色 问题
项目中需要在代码中控制字体颜色 之前是直接引用资源文件 但是不行 tv.setTextColor(R.color.textColor_black); 无效果 后来在网上找了资料发现 要从reso ...
- Dinic(模板 再错是不可能的 这辈子都不可能了)
#include<iostream> #include<cstdio> #include<cmath> #include<cstring> #inclu ...
- [Jsoi2015]字符串树
https://www.zybuluo.com/ysner/note/1298148 题面 字符串树本质上还是一棵树,即\(N\)个节点\(N-1\)条边的连通无向无环图,节点 从\(1\)到\(N\ ...
- 8 种提升ASP.NET Web API性能的方法
ASP.NET Web API 是非常棒的技术.编写 Web API 十分容易,以致于很多开发者没有在应用程序结构设计上花时间来获得很好的执行性能. 在本文中,我将介绍8项提高 ASP.NET Web ...
- Java中的super关键字何时使用
子类的构造函数中不是必须使用super,在构造函数中,如果第一行没有写super(),编译器会自动插入.但是如果父类没有不带参数的构造函数,或这个函数被私有化了(用private修饰).此时你必须加入 ...
- bzoj 1660: [Usaco2006 Nov]Bad Hair Day 乱发节【单调栈】
开一个单调递减的单调栈,然后用sum数组维护每个点的答案,新加点的时候一边退栈一边把退掉的点的sum加进来 #include<iostream> #include<cstdio> ...
- 倒计时,短信发送后倒计时效果js
<div class="input-group-addon"><a style="width: 100%;height: 100%" href ...
- python 中 str与bytes的转换
# bytes转字符串方式一 b=b'\xe9\x80\x86\xe7\x81\xab' string=str(b,'utf-8') print(string) # bytes转字符串方式二 b=b' ...
- 【[转】MySql模糊查询
转自:http://chenpeng.info/html/2020 MySQL提供标准的SQL模式匹配,以及一种基于象Unix实用程序如vi.grep和sed的扩展正则表达式模式匹配的格式. 一.SQ ...