99622024-03-21 19:16:08111Erőművekcpp17Wrong answer 5/100177ms52212 KiB
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace std;
using namespace __gnu_pbds;

template<typename T>
using ordered_set = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;

#define int long long

#define INF (int)1e18

signed main() {
	ios::sync_with_stdio(0);
	cin.tie(0);
#ifdef CB
	freopen("be2.txt","r",stdin);
//	freopen("out.txt","w",stdout);
#endif
	int N,M;
	cin>>N>>M;
	vector<int>v(N+1);
	int su=0;
	for(int i=1;i<=N;i++){
		cin>>v[i];
		su+=v[i];
	}
	vector<vector<int>>g(N+1);
	for(int i=0;i<M;i++){
		int a,b;
		cin>>a>>b;
		g[a].push_back(b);
		g[b].push_back(a);
	}
	int ans=INF;
	int ans1=0;
	int ans2=0;
	vector<int>l(N+1,INF),a(N+1,0);
	vector<int>s(N+1);
	vector<ordered_set<int>>z(N+1);
	auto dfs=[&](auto self,int i)->void{
		for(int j:g[i]){
			if(l[j]==l[i]-1){
				continue;
			}
			if(l[j]!=INF){
				if(l[j]<l[a[i]]){
					a[i]=j;
				}
				continue;
			}
			l[j]=l[i]+1;
			self(self,j);
			s[i]+=s[j];
			if(l[a[j]]<l[a[i]]){
				a[i]=a[j];
			}
			if(l[a[j]]>l[i]){
				z[j].insert(s[j]);
				int s1=su-s[j],s2,s3;
				auto f=[&](){
					ans1=max({s1,s2,s3})-min({s1,s2,s3});
					if(ans1<ans){
						ans=ans1;
						ans2=0;
					}
				};
				auto it=z[j].lower_bound(s[j]/2);
				if(it!=z[j].end()){
					s2=*it;
					s3=su-s1-s2;
					f();
				}
				if(it!=z[j].begin()){
					--it;
					s2=*it;
					s3=su-s1-s2;
					f();
				}
				if(!z[j].empty()){
					s2=*s.begin();
					s3=su-s1-s2;
					f();
					s2=*--s.end();
					s3=su-s1-s2;
					f();
				}
				int ll=max({s1-ans,su-s1-(s1+ans),(su-s1-ans)/2});
				int hh=min({s1+ans,su-s1-(s1-ans),(su-s1+ans)/2});
				if(ll<=hh){
					ans2+=z[j].order_of_key(hh+1)-z[j].order_of_key(ll);
				}
			}
			if(z[j].size()>z[i].size()){
				swap(z[i],z[j]);
			}
			for(int s1:z[j]){
				int s2,s3;
				auto f=[&](){
					ans1=max({s1,s2,s3})-min({s1,s2,s3});
					if(ans1<ans){
						ans=ans1;
						ans2=0;
					}
				};
				auto it=z[i].lower_bound(s[i]/2);
				if(it!=z[i].end()){
					s2=*it;
					s3=su-s1-s2;
					f();
				}
				if(it!=z[i].begin()){
					--it;
					s2=*it;
					s3=su-s1-s2;
					f();
				}
				if(!z[i].empty()){
					s2=*s.begin();
					s3=su-s1-s2;
					f();
					s2=*--s.end();
					s3=su-s1-s2;
					f();
				}
				int ll=max({s1-ans,su-s1-(s1+ans),(su-s1-ans)/2});
				int hh=min({s1+ans,su-s1-(s1-ans),(su-s1+ans)/2});
				if(ll<=hh){
					ans2+=z[i].order_of_key(hh+1)-z[i].order_of_key(ll);
				}
			}
			for(int k:z[j]){
				z[i].insert(k);
			}
		}
		s[i]+=v[i];
	};
	l[1]=0;
	dfs(dfs,1);
	cout<<ans<<'\n';
	cout<<ans2<<'\n';
	return 0;
}
SubtaskSumTestVerdictTimeMemory
base5/100
1Wrong answer0/03ms1760 KiB
2Wrong answer0/06ms3600 KiB
3Wrong answer0/53ms2460 KiB
4Wrong answer0/53ms2652 KiB
5Accepted5/54ms3136 KiB
6Wrong answer0/53ms2988 KiB
7Wrong answer0/58ms5160 KiB
8Wrong answer0/57ms4868 KiB
9Wrong answer0/514ms7960 KiB
10Wrong answer0/512ms7248 KiB
11Wrong answer0/637ms17524 KiB
12Wrong answer0/632ms15232 KiB
13Wrong answer0/672ms27708 KiB
14Wrong answer0/652ms23592 KiB
15Wrong answer0/6138ms37664 KiB
16Wrong answer0/671ms31416 KiB
17Wrong answer0/6127ms45176 KiB
18Wrong answer0/687ms37448 KiB
19Wrong answer0/6177ms52212 KiB
20Wrong answer0/6129ms43432 KiB