首页 > 其他分享 >P3573 [POI2014] RAJ-Rally

P3573 [POI2014] RAJ-Rally

时间:2023-10-17 22:00:18浏览次数:36  
标签:int void RAJ POI2014 pc while que Rally define

P3573 [POI2014] RAJ-Rally

题意

给一张 \(DAG\),问删去一个点的最长路是多少。

题解

好妙的题。
考虑对于每个点求出删除此点之后的最长路。
考虑到一个 \(DAG\) 只会由拓扑序低的点走向高的点。
所以我们按照拓扑序枚举点删除之后的最短路。
考虑根据当前点的拓扑序将点集划分为两个集合 \(S\) 和 \(T\) 。
我们先求出以每个点为终点和起点的最长路。
\(S\) 中维护每个点为终点的长度,\(T\) 中维护为起点的长度,同时维护 \(S->T\) 的所有路径。
显然跨过两个集合的路径可以用一条边描述,也就是两端拼起来。
考虑删除一个点的影响是什么,发现同时会影响的是从 \(S\) 中指向这个点的路径
删掉之后将其加入 \(S\),然后将跨过集合的边加入就好了,用 multiset 维护即可。

这道题的突破点就在于按照拓扑序枚举我们需要维护的东西变化很小。

点击查看代码
#include <bits/stdc++.h>
#define rg register
#define pc putchar
#define gc getchar
#define pf printf
#define space pc(' ')
#define enter pc('\n')
#define me(x,y) memset(x,y,sizeof(x))
#define pb push_back
#define FOR(i,k,t,p) for(rg int i(k) ; i <= t ; i += p)
#define ROF(i,k,t,p) for(rg int i(k) ; i >= t ; i -= p)
using namespace std ;
bool s_gnd ;
inline void read(){}
template<typename T,typename ...T_>
inline void read(T &x,T_&...p)
{
    x = 0 ;rg int f(0) ; rg char c(gc()) ;
    while(!isdigit(c)) f |= (c=='-'),c = gc() ;
    while(isdigit(c)) x = (x<<1)+(x<<3)+(c^48),c = gc() ;
    x = (f?-x:x) ;
    read(p...);
}
int stk[30],tp ;
inline void print(){}
template<typename T,typename ...T_>
inline void print(T x,T_...p)
{
    if(x < 0) pc('-'),x = -x ;
    do stk[++tp] = x%10,x /= 10 ; while(x) ;
    while(tp) pc(stk[tp--]^48) ; space ;
    print(p...) ;
}
bool S_GND ;
const int N = 1e6+5 ;
int n,m,ans,pos,top ;
int d[N],b[N],f[N],g[N],id[N] ;
vector<int>q[N],p[N] ;
void Solve1()
{
    queue<int>que ;
    FOR(i,1,n,1) if(!d[i]) que.push(i) ;
    while(!que.empty())
    {
        int x = que.front() ; que.pop() ;
        id[++top] = x ;
        for(auto v:q[x])
        {
            d[v]--,f[v] = max(f[v],f[x]+1) ;
            if(!d[v]) que.push(v) ;
        }
    }
}
void Solve2()
{
    queue<int>que ;
    FOR(i,1,n,1) if(!b[i]) que.push(i) ;
    while(!que.empty())
    {
        int x = que.front() ; que.pop() ;
        for(auto v:p[x])
        {
            b[v]--,g[v] = max(g[v],g[x]+1) ;
            if(!b[v]) que.push(v) ;
        }
    }
}
multiset<int>s ;
signed main()
{
//cerr<<(double)(&s_gnd-&S_GND)/1024.0/1024.0 ;
//	freopen(".in","r",stdin) ;
//	freopen(".out","w",stdout) ;
    read(n,m) ;
    FOR(i,1,m,1)
    {
        int u,v ; read(u,v) ;
        q[u].pb(v),p[v].pb(u),d[v]++,b[u]++ ;
    }
    Solve1(),Solve2() ;
    FOR(i,1,n,1) s.insert(-g[i]) ;
    ans = -*s.begin() ;
    // FOR(i,1,n,1) print(id[i]) ; enter ;
    // FOR(i,1,n,1) print(f[i]) ; enter ;
    // FOR(i,1,n,1) print(g[i]) ; enter ;
    FOR(t,1,n,1)
    {
        int i = id[t] ; //print(i),enter ;
        s.erase(s.find(-g[i])) ;
        for(auto v:p[i]) s.erase(s.find(-f[v]-1-g[i])) ;
        auto it = s.begin() ; if(-*it < ans) ans = -*it,pos = i ;
        s.insert(-f[i]) ; //print(-*it),enter ;
        for(auto v:q[i]) s.insert(-f[i]-1-g[v]) ;
    }
    print(pos,ans) ;
    return 0 ;
}

标签:int,void,RAJ,POI2014,pc,while,que,Rally,define
From: https://www.cnblogs.com/snow-panther/p/17770817.html

相关文章

  • 洛谷P3576 [POI2014] MRO-Ant colony 题解
    MRO-Antcolony根据下取整除法的性质\((\left\lfloor\dfrac{\left\lfloor\dfrac{x}{y}\right\rfloor}{z}\right\rfloor=\left\lfloor\dfrac{x}{yz}\right\rfloor)\),我们可以反向考虑,即从特殊边开始,计算出从每个叶子到特殊边的路径上,要除以的那个分母是什么。这个可以直接一遍df......
  • [POI2014] HOT-Hotels 加强版
    [POI2014]HOT-Hotels题面翻译给定一棵树,在树上选\(3\)个点,要求两两距离相等,求方案数。题目描述Thereare\(n\)townsinByteotia,connectedwithonly\(n-1\)roads.Eachroaddirectlylinkstwotowns.Alltheroadshavethesamelengthandaretwoway.Itis......
  • Proj CDeepFuzz Paper Reading: PELICAN: Exploiting Backdoors of Naturally Trained
    Abstract背景:本文研究的不是被恶意植入的后门,而是productsofdefectsintraining攻击模式:injectingsomesmallfixedinputpattern(backdoor)toinducemisclassification本文:PELICANGithub:https://github.com/ZhangZhuoSJTU/PelicanTask:findbackdoorvulne......
  • P5904 [POI2014] HOT-Hotels 加强版
    自然的想法是枚举共同的交点,然后进行换根dp,复杂度可以做到\(\mathcalO(n^2)\),可以通过简单版,但是显然过不了\(10^5\)的数据,考虑进行优化。记\((x,y,z)\)为满足要求的点,即满足\(a=b+c\),树形dp原则是子树内的信息无后效性,尽量把子树内的信息合并在一起。所以\(a-b=c\),......
  • [AGC002D] Stamp Rally 题解
    可以看做一道比较套路的的$kruskal$重构树。但或许也是一道复习与入门的好题。思路考虑把图论问题转化为树上问题。发现所求的为路径上最大的最小。容易想到$kruskal$重构树。发现由于从两端一起走,不能直接处理。那么就可以在外面套一个二分,内部直接倍增处理即可。Cod......
  • [POI2014] PAN-Solar Panels
    区间\(\left(l,r\right]\)中存在\(n\)的倍数的充要条件是\(\left\lfloor\frac{r}{n}\right\rfloor>\left\lfloor\frac{l}{n}\right\rfloor\)。证明:记有整数\(k\)满足\(k\timesn\in\left(l,r\right]\)。那么有\[\displaystylel<k\timesn......
  • 题解 BZOJ4543【[POI2014] HOT-Hotels】
    长链剖分优化DP板子题了,但是虽然是板子这个转移方程也很难想。problem树。求\(\sum_{1\leqi<j<k\leqn}[dist(i,j)=dist(i,k)=dist(j,k)].\)。\(n\leq10^5\)。solution与重链剖分相似,长链剖分是将树剖成很多条长链。我们定义长儿子,为一个点的儿子中子树深度最大的一个儿......
  • 外汇天眼:仿冒Rallyville──网络交友设局诱投资,无故拖延出金删账户
    近期有考虑投资外汇、期货、美国的用户,务必留意自己是否用到假冒券商。日前就有投资人向外汇天眼爆料,他被素未谋面的网友引诱到假冒的Rallyville平台注册,并因此被诈骗超过一百万元。接下来让我们一起了解整件事的详细经过。根据受害者的分享,大约2个月前,他在某个社交平台认识一位......
  • 4543: [POI2014]Hotel加强版[树形DP+长链剖分]
    题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=4543 解题思路:长链剖分定义:f[i][j]表示以i为根节点的子树,有多少个节点和i的距离是j的.g[i][j]表示以i为根节点的子树,在子树外一个距离i为j的点可以跟i子树内的两个点组成两两相等的方案数.那么就有:f[u][j+1]+=f[v......
  • STATA traj插件应用
    usehttps://www.andrew.cmu.edu/user/bjones/traj/data/panss.dta,cleargenoos=0replaceoos=rbinomial(1,.2)traj,var(p1-p6)indep(t1-t6)model(cnorm)min(-999)max(999)order(331)risk(risper)dropout(111)dcov(risperrisperrisp......