QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#104800#6322. ForestryKevin5307WA 7ms60100kbC++143.3kb2023-05-12 00:02:202023-05-12 00:02:22

Judging History

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

  • [2023-08-10 23:21:45]
  • System Update: QOJ starts to keep a history of the judgings of all the submissions.
  • [2023-05-12 00:02:22]
  • 评测
  • 测评结果:WA
  • 用时:7ms
  • 内存:60100kb
  • [2023-05-12 00:02:20]
  • 提交

answer

//Author: Kevin5307
#include<bits/stdc++.h>
//#pragma GCC optimize("O2")
using namespace std;
#define ll long long
#define ull unsigned ll
#define pb push_back
#define mp make_pair
#define ALL(x) (x).begin(),(x).end()
#define rALL(x) (x).rbegin(),(x).rend()
#define srt(x) sort(ALL(x))
#define rev(x) reverse(ALL(x))
#define rsrt(x) sort(rALL(x))
#define sz(x) (int)(x.size())
#define inf 0x3f3f3f3f
#define pii pair<int,int>
#define lb(v,x) (int)(lower_bound(ALL(v),x)-v.begin())
#define ub(v,x) (int)(upper_bound(ALL(v),x)-v.begin())
#define uni(v) v.resize(unique(ALL(v))-v.begin())
#define longer __int128_t
void die(string S){puts(S.c_str());exit(0);}
namespace _kv_hash
{
	const ull mask=std::chrono::steady_clock::now().time_since_epoch().count();
	ull shift(ull x)
	{
		x^=mask;
		x^=x<<13;
		x^=x>>7;
		x^=x<<17;
		x^=mask;
		return x;
	}
}
using namespace _kv_hash;
const ll mod=998244353;
ll f[6006000],g[6006000],tag[6006000];
int ls[6006000],rs[6006000],tot;
vector<ll> vec;
ll a[300300];
vector<int> G[300300];
ll sumA,sumB;
void pushdown(int u)
{
	if(!u) return ;
	f[u]=f[u]*tag[u]%mod;
	g[u]=g[u]*tag[u]%mod;
	if(ls[u])
		tag[ls[u]]=tag[ls[u]]*tag[u]%mod;
	if(rs[u])
		tag[rs[u]]=tag[rs[u]]*tag[u]%mod;
	tag[u]=1;
	return ;
}
int merge(int u,int v,int l,int r)
{
	pushdown(u);
	pushdown(v);
	if(!u||!v)
	{
		sumA=(sumA+f[u])%mod;
		sumB=(sumB+(f[v]*(mod+1)/2%mod)%mod)%mod;
		if(!u) tag[v]=tag[v]*sumA%mod*((mod+1)/2)%mod;
		if(!v) tag[u]=tag[u]*sumB%mod;
//		cerr<<l<<" "<<r<<" "<<sumA<<" "<<sumB<<endl;
//		f[u+v]=f[u];
//		g[u+v]=g[u];
		pushdown(u+v);
		return u+v;
	}
	if(l==r)
	{
		ll val=(f[v]*(mod+1)/2%mod)%mod;
		f[u]=(f[u]*val+f[u]*sumB+f[v]*sumA)%mod;
		g[u]=(g[u]*val+g[u]*sumB+g[v]*sumA)%mod;
		sumA=(sumA+f[u])%mod;
		sumB=(sumB+val)%mod;
		return u;
	}
	int mid=(l+r)/2;
	rs[u]=merge(rs[u],rs[v],mid+1,r);
	ls[u]=merge(ls[u],ls[v],l,mid);
	f[u]=(f[ls[u]]+f[rs[u]])%mod;
	g[u]=(g[ls[u]]+g[rs[u]])%mod;
//	cerr<<l<<" "<<r<<" "<<sumA<<" "<<sumB<<" "<<f[u]<<" "<<g[u]<<endl;
	return u;
}
int MergeTree(int u,int v)
{
	sumA=sumB=0;
	return merge(u,v,0,sz(vec)-1);
}
void update(int u,int l,int r,int p,ll v)
{
	pushdown(u);
	if(l==r)
	{
		f[u]=(f[u]+v)%mod;
		g[u]=(g[u]+v*vec[p])%mod;
		return ;
	}
	int mid=(l+r)/2;
	if(p<=mid)
	{
		if(!ls[u])
			ls[u]=++tot;
		update(ls[u],l,mid,p,v);
	}
	else
	{
		if(!rs[u])
			rs[u]=++tot;
		update(rs[u],mid+1,r,p,v);
	}
	f[u]=(f[ls[u]]+f[rs[u]])%mod;
	g[u]=(g[ls[u]]+g[rs[u]])%mod;
}
int rt[300300];
ll ans;
void dfs(int u,int fa)
{
	rt[u]=++tot;
	update(rt[u],0,sz(vec)-1,lb(vec,a[u]),1);
	for(auto v:G[u])
		if(v!=fa)
		{
			dfs(v,u);
//			cerr<<u<<" "<<v<<":"<<endl;
			update(rt[v],0,sz(vec)-1,sz(vec)-1,1);
			rt[u]=MergeTree(rt[u],rt[v]);
		}
	ll v=g[rt[u]];
	if(fa)
		ans=(ans+v*(mod+1)/2)%mod;
	else
		ans=(ans+v)%mod;
}
int main()
{
//	freopen("toptree.in","r",stdin);
//	freopen("toptree.out","w",stdout);
	for(int i=0;i<6006000;i++)
		tag[i]=1;
	int n;
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
		scanf("%lld",a+i);
		vec.pb(a[i]);
	}
	srt(vec);
	uni(vec);
	for(int i=1;i<n;i++)
	{
		int u,v;
		scanf("%d%d",&u,&v);
		G[u].pb(v);
		G[v].pb(u);
	}
	dfs(1,0);
	for(int i=1;i<n;i++)
		ans=(ans+ans)%mod;
	printf("%lld\n",ans);
	return 0;
}

详细

Test #1:

score: 100
Accepted
time: 7ms
memory: 59708kb

input:

4
1 2 3 4
1 2
2 4
3 2

output:

44

result:

ok 1 number(s): "44"

Test #2:

score: -100
Wrong Answer
time: 2ms
memory: 60100kb

input:

5
3 5 6 5 1
4 1
2 3
3 5
1 3

output:

142

result:

wrong answer 1st numbers differ - expected: '154', found: '142'