CF894E Ralph and Mushrooms_强连通分量_记忆化搜索_缩点

Code:

#include<cstdio>
#include<stack>
#include<cstring>
using namespace std;
const int maxn = 1000000 + 3;
stack<int>S;
int head[maxn], nex[maxn], val[maxn], to[maxn], cnt, n, m, s;
int low[maxn], dfn[maxn], vis[maxn], answer[maxn],  idx, scc;
long long quan[maxn];
inline void add_edge(int u, int v, int c)
{
    nex[++cnt] = head[u];
    head[u] = cnt;
    to[cnt] = v;
    val[cnt] = c; 
}
void tarjan(int u)
{
    vis[u] = 1; 
    S.push(u);
    low[u] = dfn[u] = ++scc;
    for(int v = head[u]; v ; v = nex[v])
    {
        if(!vis[to[v]]) 
        {
            tarjan(to[v]); 
            low[u] = min(low[u], low[to[v]]);
        }
        else if(!answer[to[v]]) low[u] = min(low[u], dfn[to[v]]);
    }
    if(low[u] == dfn[u])
    {
        ++idx;
        for(;;)
        {
            int x = S.top(); S.pop();
            answer[x] = idx;
            if(x == u) break;
        }
    }
}
struct Math
{
    long long  sum[100097];
    long long C[100097];
    inline void init()
    {
        sum[0] = -1;
        for(int i = 2;i <= 100007; ++i) sum[i] = sum[i - 1] + i - 1;
        for(int i = 1;i <= 100007; ++i) C[i] = sum[i] + C[i - 1];              //第 (i + 1) 项的总和
    }
    inline long long get(int w)
    {
        int l = 1, r = 100000, ans = 0;
        while(l <= r)
        {
            int mid = (l + r) >> 1;
            if(sum[mid] <= w) ans = mid, l = mid + 1;
            else r = mid - 1;
        }
        return (long long) ans * w - C[ans]; 
    }
}M;
int head2[maxn], to2[maxn << 1], nex2[maxn << 1], cnt2, val2[maxn];
inline void add_edge2(int u,int v, int c)
{
    nex2[++cnt2] = head2[u];
    head2[u] = cnt2;
    to2[cnt2] = v;
    val2[cnt2] = c;
}
long long final[maxn];
long long dp(int u)
{
    if(final[u] != -1) return final[u];
    final[u] = quan[u]; 
    for(int v = head2[u]; v ; v = nex2[v])
    {
        final[u] = max(final[u], quan[u] + val2[v] + dp(to2[v]));
    }
    return final[u];
}
int main()
{
    scanf("%d%d",&n,&m); 
    M.init();
    for(int i = 1;i <= m; ++i)
    {
        int a, b, c;
        scanf("%d%d%d",&a, &b, &c);
        add_edge(a, b, c);
    }
    scanf("%d",&s);
    for(int i = 1;i <= n; ++i)
    {
        if(!vis[i]) tarjan(i);
    }
    for(int i = 1;i <= n; ++i)
    {
        for(int v = head[i]; v ; v = nex[v])
        {
            if(answer[i] == answer[to[v]])
            {
                quan[answer[i]] += M.get(val[v]);
            }
            else 
            {
                add_edge2(answer[i], answer[to[v]], val[v]);
            }
        }
    }
    memset(final, -1, sizeof(final));
    printf("%I64d",dp(answer[s]));
    return 0;
}
### Python 中定义函数参数 在 Python 中,可以通过多种方式来定义函数的参数。这些方法提供了灵活性,使得开发者可以根据需求设计接口。 #### 定义位置参数 最简单的方式就是通过指定固定数量的位置参数: ```python def greet(name, greeting="Hello"): return f"{greeting}, {name}!" ``` 此例子中的 `name` 是必需传递给该函数的一个位置参数;而 `greeting` 则是一个带有默认值的关键字参数[^3]。 #### 关键字参数与默认值 除了基本的位置参数外,还可以设置关键字参数并为其赋予默认值。当调用者未提供特定于某个可选参数的实际值时,则会采用预设好的缺省值: ```python def describe_pet(animal_type='dog', pet_name=''): """显示宠物的信息""" print(f"\nI have a {animal_type}.") print(f"My {animal_type}'s name is {pet_name.title()}.") ``` 这里如果只给出 `pet_name` 参数,那么 `animal_type` 将自动取 'dog' 这个默认值[^4]。 #### 可变长度参数列表 (*args 和 **kwargs) 为了使函数能够接受任意数目的额外输入,可以利用特殊符号 * 来收集剩余的位置参数到元组中,以及使用两个星号 ** 收集多余的关键字参数至字典里: ```python def make_pizza(size, *toppings): # 接收不定量的位置参数 print(f"Making a {size}-inch pizza with the following toppings:") for topping in toppings: print("- " + topping) make_pizza('large', 'pepperoni') make_pizza(12, 'mushrooms', 'green peppers', 'extra cheese') def build_profile(first, last, **user_info): # 处理未知数量的关键字参数 profile = {} profile['first_name'] = first profile['last_name'] = last for key, value in user_info.items(): profile[key] = value return profile user_profile = build_profile('albert', 'einstein', location='princeton', field='physics') print(user_profile) ``` 上述代码展示了如何创建接收多个非命名(*args)和命名(**kwargs)实参的函数。 对于提到的具体案例——即希望调整 `func(var="hi", a=4, b=5)` 的参数顺序问题,在 Python 函数内部处理上是没有区别的,因为一旦使用了显式的名称赋值 (`var=`),就不再受限于声明时的形式参数次序。 因此,针对 `define_args` 函数而言,只要遵循以上原则合理安排各类型参数即可实现所需功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值