[2019CSP-S赛前训练][CF894E] Ralph and Mushrooms

题目链接:https://www.luogu.org/problem/CF894E

题目大意
Ralph打算去蘑菇森林采蘑菇。

蘑菇森林里有n个蘑菇丛,有m条有向的路连接这些丛林(可能连向自己,也可能两个丛林之间有多条路)。经过某条路时,Ralph可以采走这条路上的全部蘑菇。然而,这是一片神奇的蘑菇森林,蘑菇被采走后会重新长出来一些。但是,第k次走过这条路后,这条路上重新长出的蘑菇会比上次少k。(举个栗子,第一次有w个蘑菇,第二次有w-1个蘑菇,第三次有w-1-2个蘑菇,以此类推……)(还有,蘑菇的数量大于0)。

那么,Ralph最多可以采到多少蘑菇呢?
输入输出样例
输入 #1

2 2
1 2 4
2 1 4
1

输出 #1

16

输入 #2

3 3
1 2 4
2 3 3
1 3 8
1

输出 #2

8

这个题目应该不难想到,一个强连通分量内的所有蘑菇都可以采光(重复走,一直绕圈把路上的所有蘑菇采掉)

那么一个强连通分量内的所有蘑菇数量是多少呢?

\({n(n+1)<=w}\) 的最大的 \({n}\) ,解二次不等式,\(n\) 就是 \(1.0*\sqrt{0.25+2a}-0.5\)

然后价值就是 \(nw?\sum^{n}_{i=1}i(i+1)/2+w\) ,也就是 \({nw?n(n+1)(n+2)/6+w}\)

所以我们可以先用Tarjan缩点求出强连通分量,把边权合并到点上,重新建图,再来搜索一下就OK了;

那么注意几个地方:1.要开long long;

2.点权与边权混合加时不要漏加了终点的点权;

3.代码可能有点难调,耐心一点,一定可以调出来的(祭本题提交9次);

附上双倍经验:P2656 采蘑菇,稍微修改一下就能过了!

#include <bits/stdc++.h>
#define N (2000000+5)
#define int long long
using namespace std;
int n,m,s;
int top,sum,deep;
int dfn[N],low[N],color[N],vis[N],st[N];
int cnt[N],in[N],wp[N],f[N];
int u[N],v[N],wei[N];
vector <int> edge[N],w[N];
void Tarjan(int u)
{
    vis[u]=1;
    dfn[u]=low[u]=++deep;
    st[++top]=u;
    for(int i=0;i<edge[u].size();i++)
    {
        int now=edge[u][i];
        if(!dfn[now])
        {
            Tarjan(now);
            low[u]=min(low[u],low[now]);
        }
        else
        {
            if(vis[now]) low[u]=min(low[u],low[now]);
        }
    }
    if(dfn[u]==low[u])
    {
        color[u]=++sum;
        vis[u]=0;
        while(st[top]!=u)
        {
            color[st[top]]=sum;
            vis[st[top--]]=0;
        }
        top--;
    }
}
int dfs(int u)
{
    if(vis[u]) return f[u];
    int res=0;
    vis[u]=1;
    for (int i=0;i<edge[u].size();i++)
    {
        int now=edge[u][i];
        res=max(res,dfs(now)+w[u][i]);
    }
    return f[u]=res+wp[u];
}
int cont(int a)
{
    int k=1.0*sqrt(0.25+2*a)-0.5;
    return a*k-k*(k+1)*(k+2)/6+a;
}
signed main()
{
    scanf("%lld%lld",&n,&m);
    for(int i=1;i<=m;i++)
    {
        scanf("%lld%lld%lld",&u[i],&v[i],&wei[i]);
        edge[u[i]].push_back(v[i]);
    }
    for(int i=1;i<=n;i++) if(!dfn[i]) Tarjan(i);
    for(int i=1;i<=n;i++) vector<int>().swap(edge[i]);
    for(int i=1;i<=m;i++)
    {
        if(color[u[i]]==color[v[i]])
        {
            wp[color[u[i]]]+=cont(wei[i]);
        }
        else
        {
            //printf("u=%lld v=%lld\n",color[u[i]],color[v[i]]);
            edge[color[u[i]]].push_back(color[v[i]]);
            w[color[u[i]]].push_back(wei[i]);
            in[color[v[i]]]++;
        }
    }
    scanf("%lld",&s);
    memset(vis,0,sizeof(vis));
    printf("%lld\n",dfs(color[s]));
    return 0;

原文地址:https://www.cnblogs.com/Xx-queue/p/11708539.html

时间: 2024-08-06 19:15:40

[2019CSP-S赛前训练][CF894E] Ralph and Mushrooms的相关文章

「CF894E」 Ralph and Mushrooms

传送门 Luogu 解题思路 首先我们要发现:在同一个强连通分量里的所有边都是可以无限走的. 那么我们就有了思路:先缩点,再跑拓扑排序. 那么问题就是 \(\text{DP}\) 状态如何初始化. 我们首先考虑一条原始边权为 \(c\) 的边,无限走可以刷出多少贡献: 假设我们走 \(t\) 次就可以把这条边刷完,那么 \(t\) 应该是满足下面这个式子的最大整数: \[\frac{t(t+1)}{2}< c\] 解得: \[t=\left\lfloor\sqrt{2t+\frac{1}{4}}

【Codeforces】894E.Ralph and Mushrooms Tarjan缩点+DP

题意 给定$n$个点$m$条边有向图及边权$w$,第$i$次经过一条边边权为$w-1-2.-..-i$,$w\ge 0$给定起点$s$问从起点出发最多能够得到权和,某条边可重复经过 有向图能够重复经过的边当且仅当成环,所以tarjan缩点成DAG,缩点后每个点内的权值可以通过二分算出,假设最大的$n$使得$w-\frac{n(n+1)}{2}\ge 0$,那么该点值为$(n+1)w-\frac{n(n+1)(n+2)}{6}$,通过对DAG进行dp算出最长路就是答案 代码 #include <b

【NOI赛前训练】——专项测试1&#183;网络流

T1: 题目大意: 传送门 给一个长度为$n(n<=200)$的数列$h$,再给$m$个可以无限使用的操作,第$i$个操作为给长度为花费$c_i$的价值给长度为$l_i$的数列子序列+1或-1,求将数列变为不下降数列的最小花费. 题解: 第一部分(上下界最小费用可行流): 设$h_0=-inf,h_{n+1}=inf$,令$a$为$h$的差分数组,即$a_i=h_{i}-h_{i-1}$.考虑当对于区间$[l,r]$操作时(比如+1),相当于$a_{r+1}$减少1,$a_{l}$增加1.若将$

[NOI赛前训练]——专项测试3&#183;数学

由于并不想写T1和T2的题解……所有只有T3的题解了. T3 由于内部题就只写题解了. 好吧,我是一点都不想写…… 说一下这zz题解哪里写错了吧…… ……不想写…… 就说一个吧…… $n-\frac{k-i}{2}$应该是$\frac{k-i}{2}$. 好累啊,完全不想写题解,有空再说吧. 1 #include "bits/stdc++.h" 2 3 using namespace std; 4 5 const int N=4e2+10; 6 7 double f[N][N],p[N

如何做到让自己长时间精神专注?

让你的注意力聚焦在你所做的事情上,你的处理速度趋近于你的接收速度,你的思维跟上你所做的事情的发展.然后保持,就OK了. 这好像是句废话,你问我如何长时间集中注意力,我第一句就说你的注意力要集中才能长时间集中注意力.但是这句废话就是问题的实质,我们下面各种例证来揭示这个实质. 当你看一部武侠小说的时候,你为什么能够两个多小时精神专注于这本武侠小说上呢?首先因为你的注意力很容易就放在这部武侠小说上,其次你的思维完全同步于武侠小说的发展,最后你的处理速度是趋近于你的接收速度的,(虽然你的大脑处理速度比

班级职责、制度与考核(2011-03-31 18:10:32)

在过去的一个学期里,开始有着好的班级规划,因为要求严格,同学们受不了约束.吃不了苦.有的同学还想转班,就这种情况,有的同学无法理解,无法接受:后面就慢慢的放松,也更多的让班干部去管理,去发挥.总的来讲,取得了一定的成绩,但是并没有达到班级的目标和要求,这是存在一些问题的,所以,上个学期没有完成的目标,接着这个学期必须完成,在某些方面必须形成突破.恰好与学院的指导思想一至.目标一至:所以,这学期的班干部的调整. 班干的考核.同学们的考核.班级的建设一步步的落实,与系部.与学院的工作思路是一致的.

访石家庄环保一线警察:四个绰号背后的斩污人q7

"张女士说,房租加上员工工资,是百盛运营成本中最大的负担.有关各方应该在充分考虑潜在风险的基础上,推动互联网金融的稳步.可持续发展.在中国海洋石油总公司,吴翠云拜访了公司党组书记.董事长王宜林和党组成员.副总经理王家祥,并就项目推进达成一致意见.决赛当晚,举办地石狮体育馆内精彩纷呈,场边观众也是热情高涨."杨敏说,打那之后她经常以泪洗面,几乎得了抑郁症.据市安监局相关负责人分析,除了今年考试报名人数大幅减少,已经持有合格证的摊主最终"出摊"数量恐怕也会减少.充分发挥

一波未平一波又起 第4名美国高官卷入&quot;包机门&quot;te

本基金在任何交易日日终,持有的卖出期货合约价值不得超过基金持有的股票总市值的20%.对于医学笔记仅仅是为了应付考试一说,在学院药理学老师刘剑看来,远非如此."虽然一线城市的消费者信心指数从114点下降3点至111点,但并不代表一线城市购买力会下降,董沛德表示.总局第二督导组史康成.王芹.邱雪以及总局人事司黄文博等同志列席了会议.一是准确把握全面深化改革的新思想.新要求和主要内容.美联社最新民调显示,有60%的美国民众相信阴谋论."高先生说,事故发生之后,微面司机一直没下来,趴在方向盘上

中国体育从一枝独秀到三箭齐发 体育产业&quot;井喷&quot;o

对掌握集体土地"大权"的村干部来说,靠山吃山,靠地赚钱,变成了最为简单.直接.来钱快的"致富"方式.由于中梁山的天然分割,九龙坡区"东城西乡"的格局较明显.同时,永旺也已将日本零售专业化的商业模式引进国内.数十人接到诈骗电话房管局究竟有没有给购房者拨打退税电话呢?1接着边跺脚边哭丧着脸说完所有"感谢",笑翻全常李雪健卖萌:我会爱护小金马!"我认为,医生之所以让患者家属签同意书,就是为了减少或降低医生的风险,变相地把责