QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#270271 | #7875. Queue Sorting | ucup-team206# | RE | 0ms | 0kb | C++17 | 3.3kb | 2023-11-30 17:36:39 | 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