今天div2T3
  • 板块学术版
  • 楼主hepp
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/8/15 18:35
  • 上次更新2024/8/15 20:27:28
查看原帖
今天div2T3
541313
hepp楼主2024/8/15 18:35

rt 人麻了,想到O(n2)O(n^2)方法连样例也没过,有没有大佬给组小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;
}

2024/8/15 18:35
加载中...