[Luogu P5680][GZOI2017]共享单车

题目链接

之前没看懂题意就把这题扔了,现在一看是读错题意了

简化版题意

给出一颗树(这个图的最短路径生成树),每个点初始颜色为\(0\)

两种操作:

  1. 将部分点颜色取反
  2. 给出一些点,建出虚树(边权为两点树上距离),求最小割边代价使得虚树上没有颜色为\(1\)的点与根联通

那这就很模板了:

设\(f[x]\)表示\(x\)子树的答案,\(c[x]\)表示\(x\)的颜色,则有转移方程:(当\(f[K]=0\)时输出\(-1\))
\[
f[x]+=Val(x,y)\quad (c[y]=1)\f[x]+=\min (Val(x,y),f[y])\quad (c[y]=0)
\]

(注意以上方法没有考虑边权全为\(0\)但是答案不为\(-1\)的情况,不过好像没有这种数据,反正也不难特判就没管了)

时间复杂度 \(O((N+M)\log N+Qnum(\log num+\log N))\)

(数据为什么这么小)

代码:

#include <queue>
#include <cstdio>
#include <cctype>
#include <vector>
#include <cstring>
#include <algorithm>

inline char Getchar()
{
    static char In[1<<22],*p1=In,*p2=In;
    return p1==p2&&(p2=(p1=In)+fread(In,1,1<<22,stdin),p1==p2)?EOF:*p1++;
}

inline int Getint()
{
    int x=0,c;
    while(!isdigit(c=Getchar()));
    for(;isdigit(c);c=Getchar())x=x*10+(c^48);
    return x;
}

const int N=50005,Inf=0x7f7f7f7f;
int n,M,K,Q,Dis[N],Pre[N];
int Dfn[N],Tim,Dep[N],f[N][16];
int c[N],a[N],s[N],Top;
std::vector<int> G[N],Gv[N],T[N],V[N];
//Graph|Graph Value|Tree|Virtual Tree

void Dijkstra()
{
    struct Rec{int x,d;inline bool operator<(const Rec& o)const{return d>o.d;}};
    std::priority_queue<Rec> q;
    memset(Dis,0x7f,sizeof Dis);
    q.push((Rec){K,Dis[K]=0});
    while(!q.empty())
    {
        int x=q.top().x,d=q.top().d;
        if(q.pop(),d!=Dis[x])continue;
        for(int i=0,y,v;i<(int)G[x].size();++i)
            if(Dis[y=G[x][i]]>Dis[x]+(v=Gv[x][i])||(Dis[y]==Dis[x]+v&&x<Pre[y]))
                q.push((Rec){y,Dis[y]=Dis[x]+v}),Pre[y]=x;
    }
    for(int i=1;i<=n;++i)if(i!=K)T[Pre[i]].push_back(i);
}

void DFS(int x,int Fa)
{
    Dfn[x]=++Tim,Dep[x]=Dep[f[x][0]=Fa]+1;
    for(int i=1;i<=15;++i)f[x][i]=f[f[x][i-1]][i-1];
    for(auto y:T[x])if(y!=Fa)DFS(y,x);
}

int Lca(int x,int y)
{
    if(Dep[x]<Dep[y])std::swap(x,y);
    for(int i=15;i>=0;--i)if(Dep[f[x][i]]>=Dep[y])x=f[x][i];
    if(x==y)return y;
    for(int i=15;i>=0;--i)if(f[x][i]!=f[y][i])x=f[x][i],y=f[y][i];
    return f[y][0];
}

int DP(int x)
{
    int Res=0;
    for(auto y:V[x])
    {
        int v=DP(y);
        if(c[y])Res+=Dis[y]-Dis[x];
        else Res+=std::min(v,Dis[y]-Dis[x]);
    }
    V[x].clear();
    return Res;
}

int main()
{
    //freopen("in.txt","r",stdin);
    n=Getint(),M=Getint(),K=Getint(),Q=Getint();
    for(int i=1,x,y,z;i<=M;++i)
    {
        x=Getint(),y=Getint(),z=Getint();
        G[x].push_back(y),Gv[x].push_back(z);
        G[y].push_back(x),Gv[y].push_back(z);
    }
    Dijkstra(),DFS(K,0);
    for(int o,k;Q--;)
        if(o=Getint(),k=Getint(),!o)while(k--)c[Getint()]^=1;
        else
        {
            for(int i=1;i<=k;++i)a[i]=Getint();
            s[Top=1]=K,std::sort(a+1,a+k+1,[](int x,int y){return Dfn[x]<Dfn[y];});
            for(int i=1;i<=k;++i)
            {
                int Ls=Lca(s[Top],a[i]);
                while(Top>1&&Dfn[s[Top-1]]>=Dfn[Ls])V[s[Top-1]].push_back(s[Top]),--Top;
                if(s[Top]!=Ls)V[Ls].push_back(s[Top]),s[Top]=Ls;
                s[++Top]=a[i];
            }
            while(Top>1)V[s[Top-1]].push_back(s[Top]),--Top;
            int Ans=DP(K);
            printf("%d\n",Ans?Ans:-1);
        }
    return 0;
}

原文地址:https://www.cnblogs.com/LanrTabe/p/12173581.html

时间: 2024-10-12 11:27:35

[Luogu P5680][GZOI2017]共享单车的相关文章

聊一聊共享单车

1.共享单车的模式用户交押金,然后骑车,按照骑车时间进行计费.其实,严格意义上来讲,这还并不属于共享经济,更像分时租赁. 2.共享单车的用户人群 & 特征用户人群:80后.90后的低频打车人群,其中学生.白领偏多用户特征:年轻群体.接受新兴事物能力强,追求时尚:城市节奏生活快,白领.学生等时间紧张,交通拥堵现象严重:中低端消费人群,追求性价比:城市污染问题日益严重,追求环保出行方式 3.满足需求:主要满足了用户 短途出行的需求,具体如下:固定需求:固定线路:上学/放学.上班/下班,从学校.公司等

爬虫获取mobike共享单车信息

背景:端午节假期的时候参加了学校的数学建模比赛,题目是关于共享单车的供需匹配问题,需要获得共享单车的数量和时空分布情况. 在苦苦找寻数据无果的情况下决定自己用爬虫对天津地区的mobike进行统计. 在网上找到了这篇爬虫的代码,本着少造轮子的基本原则,我选择了这个代码进行统计,这里记录一下历程,方便日后查阅. 先上原作者github地址:git clone https://github.com/derekhe/mobike-crawler.python3环境,爬取的是微信小程序,之前是可以爬手机客

共享单车APP定制为什么深受大学生依赖?

随着最近共享单车APP获得融资的消息,现在街头随处可见那些共享单车的踪迹.是什么原因催生了这些单车的发展,为什么这些单车APP会这么深受大学生依赖呢?广州APP开发品向科技跟大家详细解释下原因. 单车共享APP为何应以校园作为切入口 1.使用率高:相较于其他的用户群体来说,由于大学校园相对比较大,学生们上课.赶时间时都需要骑单车.而且学生们在校园与校园之间游走时骑单车要方便很多.就以广州大学城为例,骑单车比等公交车的要方便多. 2.相对比较诚信:相对比来说,学生群体的诚信度是比较高的. 3.市场

共享单车也玩山寨!还能做哪些突破底线的事儿?

在大众的印象中,山寨虽然早已成为常态,但其模仿的对象往往是成熟的产品或者服务.将后者照搬过来改头换面,借助后者的影响力,去蹭一波热点,以最快的速度捞钱,是山寨的最大特点.但没想到的是,就在方兴未艾的共享单车领域,竟然也出现了山寨事件! 这一山寨事件,是某创业企业对ofo小黄车进行copy,让人傻傻难辨真假.那么问题来了,为了能在火爆的共享单车领域占有一席之地,部分共享单车企业未来还会做出哪些突破底线,一切向钱看的事儿呢? 从头到脚的山寨!让人目瞪口呆 近日,四川广安街头蹭蹭蹭地冒出一批共享单车.

共享单车“残废”之后,怎么处理才是上上策?

自共享单车诞生之后,关于它的争议.诋毁.赞扬.痛批等或褒或贬的声音从未停止.但不管怎样,似乎都无法让共享单车高歌猛进的态势停下来.如今,共享单车的火爆是其他共享经济细分项目所无法比拟的.而在凑齐了"赤橙黄绿青蓝紫",甚至土豪金.纯黑等多种颜色之后,这些花花绿绿的单车"残废"之后如何处理也被摆上了日程. 修理成本高.修理时间长.回收价格极低.修理速度不如投放新车速度--这些都是共享单车"残废"之后必须面对的问题.为此,将"残废"

扶共享单车

我,一名来深圳的程序员,住在城中村.今天和来深出差的发小散步,聊了很多心得.23:50,在回宿舍的路上,一群人走在前面,其中一个不知是有意还是无意就顺手推到了一排共享单车,然后笑着离去. 对此,我暂时就不发表当时的心理活动了.当我走到横躺在路边的单车旁,便一个一个扶起了这些平时给我带来方便的单车们.在这我就想表达,我以后会尽自己的一些能力,扶起路边倒下的共享单车.最后也 希望看到这篇日记的朋友们能和我做一样的事--扶起平时给我们带来方便的单车.

全民围剿!共享单车窘境下该怎么挽回民心

虽然当下共享经济项目层出不穷,但其中最引人注目.潜力最大,且对大众生活影响最广的当属共享单车.在过去的一两年时间中,共享单车从零开始以最短的时间在国内彻底火爆.而在满足大众短途出行刚需的同时,资本的热度也让共享单车"昏了头". 其中最典型的,就是像扔钱一样疯狂在城市中投放单车.似乎投放单车数量的多少,直接与自身的实力.所占市场的份额等挂钩.而由此造成的严重后果,是共享单车成为城市的负面"标签"--影响交通.污染环境.安全风险--由此,全国多个城市开始对共享单车进行&

关于共享单车的供电问题如何解决?

摩拜一代,后轮上的发电机. 给后轮上安装一个发电花鼓,然后在正常骑行的时候少工作或者不工作,在刹车的时候满负荷工作,所以这种车骑的时候稍微重一点,而且刹车的时候手感和一般自行车不太一样: 一般自行车,无论你多用力捏闸,这种摩擦减速的特性不会被改变的一点是:车速越快,制动效果越差,停车时,制动效果最强.制动力与车速成反比关系.这是一般自行车,实际上也是所有通过摩擦产生制动效果的机械的共有特性. 然而摩拜单车的后轮制动效果,从感受上来说,几乎是反过来的:车速越快,制动效果越强劲,停车时,完全感受不到

50天!3家!共享单车终于开始了“大逃亡”

还记得当年的"千团大战"么?惨烈至极.血流成河.但最终,仅剩下美团和大众点评--二者还合二为一了.与其相似的,还有共享打车行业.社交行业.信息分类行业等.国内特殊的互联网形势决定了,在一条赛道上只能容下数名大佬参赛者比拼,其余的在半路上就会被提前淘汰出局.而在目前火爆的共享单车行业,似乎也要"拧干水分",显现出最残酷的一面. 数据显示,从6月中旬到8月初,短短的50天中已经有三家共享单车企业倒闭.而这或许只是一个信号,随着时间的推移,共享单车行业有可能还会加快洗牌的