[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】布娃娃 权值线段树
题目描述 小时候的雨荨非常听话,是父母眼中的好孩子.在学校是老师的左右手,同学的好榜样.后来她成为艾利斯顿第二代考神,这和小时候培养的良好素质是分不开的.雨荨的妈妈也为有这么一个懂事的女儿感到高兴.一 ...
随机推荐
- Android Studio常见问题
1.导入他们项目时出现R文件出错 首先我们须要了解的是Android studio 是基于gradle的编译模式,内部没有gen文件夹更没有R文件,可是既然它报了这个错.肯定是有原因的.即Gradle ...
- doGet() throws NamingException报错
做一个通过JNDI查找资源的小练习,Context = new InitialContext(),发现NamingException异常,eclipse编辑器只有catch的提示,没有throws的提 ...
- Application Warm-up Module IIS7.5 也有Warm Up功能,让ASP.NET 第一次Request不变慢
Application Warm-up Module: 應用程式的暖機代理人 http://www.microsoft.com/taiwan/technet/iis/expand/Applicatio ...
- 在WIN7里IE8的开发人员工具打不开的解决办法
IE8新增了开发人员工具,非常不错,比早期的DevToolbar好用多了.不过在我的Win7下使用的时候偶尔会出现一个莫名其妙的问题,就是整个开发人员工具窗口消失了,打不开了.当你使用win+Tab切 ...
- 学生表、课程表、 成绩表 、教师表sql练习
转自:http://yuncode.net/code/c_58df7a8ca687e58 1.查询“1”课程比“2”课程成绩高的所有学生的学号: SELECT t1.student_id FROM ...
- 昆石VOS3000_2.1.2.4完整安装包及安装脚本
安装包下载地址:http://www.51voip.org/post/56.html 安装教程: 上传安装包 ·给整个目录授权 chmod 777 /root/vosintsall `核实 关闭sel ...
- rspec
require 'rails_helper' RSpec.describe Jira, '#set_jira_jlist' do it "this sentence is after it& ...
- bzoj 1741: [Usaco2005 nov]Asteroids 穿越小行星群【最大点覆盖】
二分图最大点覆盖模型,因为对于一个点(x,y)显然只要选x或者y就好了,于是连边,跑最大匹配=最大点覆盖(不会证) #include<iostream> #include<cstdi ...
- [C++ STL] 各容器简单介绍
什么是STL? 1.STL(Standard Template Library),即标准模板库,是一个高效的C++程序库. 2.包含了诸多常用的基本数据结构和基本算法.为广大C++程序员们提供了一个可 ...
- [Qt Creator 快速入门] 第3章 窗口部件
从这一章开始正式接触Qt的窗口部件.在第2章曾看到 Qt Creator 提供的默认基类只有 QMainWindow.QWidget 和 QDialog 这3种.QMainWindow 是带有菜单栏和 ...