社区讨论

50分MLE求助

P5619[DBOI2019] 持矢参与者 2已保存回复 2

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@mi75crmq
此快照首次捕获于
2025/11/20 16:05
4 个月前
此快照最后确认于
2025/11/20 23:59
4 个月前
查看原帖
Subtask 2 都只用了十几 MB,我实在想不到怎么会卡空间
CPP
#include<bits/stdc++.h>
#define ll long long
#define MOD 19260817
using namespace std;
inline ll ksm(ll x, ll y, ll ksmmod = MOD)
{
    x %= ksmmod;
    y %= ksmmod - 1;
    ll now=1;
    while(y)
    {
        if(y&1)
        {
            now = now * x % ksmmod;
        }
        x = x * x % ksmmod;
        y >>= 1;
    }
    return now % ksmmod;
}
inline ll read()
{
    ll s=0,t=1;
    char c=getchar();
    while(c<'0'||c>'9')
    {
        if(c=='-')t*=-1;
        c=getchar();
    }
    while(c>='0'&&c<='9')
    {
        s=(s<<1)+(s<<3)+c-'0';
        c=getchar();
    }
    return s*t;
}
void work();
int main()
{
    ll T=1;
    while(T--)
    {
        work();
    }
}
int n,m;
int      siz[2000006];
int       dp[2000006];
vector<int>e[2000006];
void f(ll x,ll from)
{
    siz[x]=1;
    ll res=dp[x];
    for(auto to:e[x])
    {
        if(to==from)continue;
        f(to,x);
        siz[x]+=siz[to];
        res=res*dp[to]%MOD;
    }
    dp[x]=res;
}
void work()
{
    ll ii=ksm(2,19260815,MOD);
    n=read();
    m=read();
    for(ll i=1;i<=n;i++)
    {
        ll x=read()%MOD;
        dp[i]=(x+1)%MOD;
    }
    for(ll i=1;i<n;i++)
    {
        ll u=read(),v=read();
        e[u].push_back(v);
        e[v].push_back(u);
    }
    f(1,0);
    ll answer=0;
    ll res1,res2,x;
    for(ll i=1;i<=m;i++)
    {
        x=read();
        res1=dp[x],res2=ksm(ii,siz[x],MOD);
        answer+=((res1-1+MOD)%MOD*res2)%MOD;
        answer%=MOD;
    }
    printf("%lld\n",answer);
}

回复

2 条回复,欢迎继续交流。

正在加载回复...