QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#270271#7875. Queue Sortingucup-team206#RE 0ms0kbC++173.3kb2023-11-30 17:36:392023-11-30 17:36:39

Judging History

你现在查看的是最新测评结果

  • [2023-11-30 17:36:39]
  • 评测
  • 测评结果:RE
  • 用时:0ms
  • 内存:0kb
  • [2023-11-30 17:36:39]
  • 提交

answer

#include<bits/stdc++.h>
using namespace std;

#define int long long

using pii=pair<int,int>;

const int N=1e6+1e3+7,P=998244353;

int qpow(int a,int b)
{
    int ret=1;
    while(b)
    {
        if(b&1)
            ret=ret*a%P;
        b>>=1;
        a=a*a%P;
    }
    return ret;
}

int n,m;

vector<pii> g[N],e[N],h[N];

int vis[N],dc,in[N],en[N],st[N];

int d[N],anc[N][21],dep[N];

void dfs(int x)
{
    vis[x]=++dc;
    st[x]=dc;
    in[x]=1;
    for(auto [v,w]:g[x])
    {
        if(vis[v])
        {
            if(in[v])
                continue;
            h[v].push_back({x,w});
        }
        else
        {
            anc[v][0]=x;
            for(int j=1;j<20;j++)
                anc[v][j]=anc[anc[v][j-1]][j-1];
            e[x].push_back({v,w});
            d[v]=d[x]*w%P;
            dfs(v);
        }
    }
    in[x]=0;
    en[x]=dc;
}

int lca(int x,int y)
{
    if(dep[x]<dep[y])
        swap(x,y);
    for(int i=19;i>=0;i--)
        if(dep[x]-(1<<i)>=dep[y])
            x=anc[x][i];
    if(x==y)
        return x;
    for(int i=19;i>=0;i--)
        if(anc[x][i]!=anc[y][i])
            x=anc[x][i],y=anc[y][i];
    return anc[x][0];
}

namespace VT{
    int m,i,a[N],q[N],t,tot;
    bool vip[N],vis[N];

    bool cmp(int x,int y)
    {
        return st[x]<st[y];
    }

    vector<pii> e[N];

    vector<int> et[N];

    void add(int u,int v)
    {
        if(u==v)
            return;
        if(st[u]>st[v])
            swap(u,v);
        e[u].push_back({v,d[v]*qpow(d[u],P-2)%P});
    }

    int dp[N];

    int SC;

    void dfs(int x)
    {
        dp[x]=0;
        for(auto [v,w]:e[x])
        {
            dfs(v);
            dp[x]=(dp[x]+(1-dp[x]+P)*dp[v]%P*w%P)%P;
        }
        for(auto w:et[x])
            dp[x]=(dp[x]+(1-dp[x]+P)*w)%P;
        if(SC==x)
            dp[x]=1;
    }

    void solve(int S)
    {
        SC=S;
        vector<int> v;
        for(auto [y,w]:h[S])
            et[y].push_back(w),v.push_back(y);
        v.push_back(S);
        sort(v.begin(),v.end());
        v.erase(unique(v.begin(),v.end()),v.end());
        if(v.size()&&v[0]==1)
            v.erase(v.begin());
        m=v.size();
        vis[1]=vip[1]=a[1]=1;
        for(tot=++m,i=2;i<=m;i++)
            a[i]=v.back(),v.pop_back(),vis[a[i]]=vip[a[i]]=1;
        int x;
        sort(a+1,a+m+1,cmp);
        for(i=1;i<m;i++)
            if(!vis[x=lca(a[i],a[i+1])])
                vis[a[++tot]=x]=1;
        m=tot,sort(a+1,a+m+1,cmp);
        for(q[t=1]=1,i=2;i<=m;q[++t]=a[i++])
        {
            while(st[a[i]]<st[q[t]]||en[a[i]]>en[q[t]])
                t--;
            add(q[t],a[i]);
        }
        dfs(1);
        cout<<dp[1]<<"\n";
        for(int i=1;i<=m;i++)
        {
            vis[a[i]]=vip[a[i]]=0;
            e[i].clear(),et[i].clear();
        }

        for(int i=1;i<=n;i++)
            e[i].clear(),et[i].clear(),dp[i]=0;
    }

}

signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cin>>n>>m;
    for(int i=1;i<=m;i++)
    {
        int u,v,p,q;
        cin>>u>>v>>p>>q;
        p=p*qpow(q,P-2)%P;
        g[u].push_back({v,p});
    }
    d[1]=1;
    dfs(1);
    cout<<1<<"\n";
    for(int i=2;i<=n;i++)
        VT::solve(i);
}

详细

Test #1:

score: 0
Runtime Error

input:

4
1 1 1 1

output:


result: