rt 人麻了,想到O(n2)方法连样例也没过,有没有大佬给组小hack? 样例2看不出来/kel
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=510,M=1e6+10,mod=998244353;
inline int read()
{
int x=0;char ch=getchar();
while(ch<'0'||ch>'9') ch=getchar();
while(ch>='0'&&ch<='9') {x=(x<<3)+(x<<1)+(ch-'0');ch=getchar();}
return x;
}
int n,m,flg[N],d[N],ans[N];
int e[M],to[M],hom[N],c[N];
int dfn[N],low[N],cnt;
int l[N],r[N],f[N],o[N];
void bid(int x,int y){e[++e[0]]=y,to[e[0]]=hom[x],hom[x]=e[0];}
int pw(int x,int y)
{
int as=1;
while(y)
{
if(y&1) as=(as*x)%mod;
x=x*x%mod,y>>=1;
}
return as;
}
void dfs(int t,int x,int fa)
{
if(x>t) return;
dfn[x]=low[x]=++cnt;
for(int i=hom[x];i;i=to[i])
{
if(e[i]>t) continue;
if(!dfn[e[i]])
{
dfs(t,e[i],x);
low[x]=min(low[e[i]],low[x]);
}
else if(e[i]!=fa)
low[x]=min(low[x],dfn[e[i]]);
}
if(dfn[x]==low[x])
d[x]=1;
}
void wrk(int u,int v,int w)
{
memset(c,0,sizeof(c));
memset(f,0,sizeof(f));
cnt=0;memset(d,0,sizeof(d));
dfs(u,u,0),f[v]=w;
for(int i=v;i>=2;i--)
{
if(d[i]) continue;
if(i!=v)
c[i]=(c[i]+c[i+1])%mod,f[i]=c[i];
ans[i]=(ans[i]+f[i])%mod;
c[r[i]]=(c[r[i]]+f[i]*o[r[i]-l[i]+1])%mod;
c[l[i]-1]=(c[l[i]-1]+f[i]*o[r[i]-l[i]+1])%mod;
}
}
signed main()
{
n=read();
for(int i=1;i<=n;i++)
o[i]=pw(i,mod-2);
for(int i=2;i<=n;i++)
{
l[i]=read(),r[i]=read();
for(int j=l[i];j<=r[i];j++)
bid(i,j),bid(j,i);
}
m=read();
while(m--)
{
int u=read(),v=read(),w=read();
wrk(u,v,w),wrk(v,u,w);
}
for(int i=2;i<=n;i++)
printf("%lld ",ans[i]);
return 0;
}