求调之对拍七十万极限数据抵不过CF test 7
查看原帖
求调之对拍七十万极限数据抵不过CF test 7
141599
sinsop90楼主2024/1/18 07:45
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 5, INF = 1e7;
int n, K, a[maxn], f[maxn][1005], head[maxn], tot, Gcd[1005][1005], T;
vector<int> vect;
struct node {
	int v, pre;
}e[maxn << 1];
void add(int u, int v) {
	e[++ tot].v = v;
	e[tot].pre = head[u];
	head[u] = tot;
}
int lcm(int x, int y) {
	return x * y / Gcd[x][y];
}
void dfs(int now, int fa) {
	vector<int> vec(1005);
	for(int i = head[now];i;i = e[i].pre) {
		int v = e[i].v;
		if(v == fa) continue;
		dfs(v, now);
		for(int i = 0;i < vect.size();i++) vec[vect[i]] += f[v][i]; 
	}
	for(int id = 0;id < vect.size();id++) {
		int i = vect[id];
		if((a[now] * Gcd[i][a[now]]) % i != 0) {
			f[now][id] = INF;
		}
		else {
			f[now][id] = INF;
			for(int j = 0;j < vect.size();j++) {
				if((vect[j] * a[now]) % i != 0) continue;
				f[now][id] = min(f[now][id], vec[lcm(vect[j], i / Gcd[vect[j]][i])] + 1);
			}
			if(a[now] % i == 0) f[now][id] = min(f[now][id], vec[i]);
		}
	}
}
void solve() {
	vect.clear();
	cin >> n >> K;
	for(int i = 1;i <= n;i++) cin >> a[i];
	for(int i = 1, u, v;i < n;i++) {
		cin >> u >> v;
		add(u, v), add(v, u);
	}
	if(!K) {
		cout << a[1] << '\n';
		tot = 0;
		for(int i = 1;i <= n;i++) head[i] = 0;
		return;
	}
	for(int i = 1;i <= a[1];i++) if(a[1] % i == 0) vect.push_back(i);
	dfs(1, 0);
	vector<int> vec(1005);
	for(int i = head[1];i;i = e[i].pre) {
		int v = e[i].v;
		for(int j = 0;j < vect.size();j++) vec[j] += f[v][j];
	}
	int ans = 0;
	for(int i = 0;i < vect.size();i++) {
		if(vec[i] < K) ans = max(ans, a[1] * vect[i]);
	}
	
	cout << ans << '\n';
	tot = 0;
	for(int i = 1;i <= n;i++) {
		head[i] = 0;
	}
}
int main() {
//	freopen("1.in", "r", stdin);
//	freopen("my.out", "w", stdout);
	ios::sync_with_stdio(0);
	cin.tie(0), cout.tie(0);
	for(int i = 1;i <= 1000;i++) for(int j = 1;j <= 1000;j++) Gcd[i][j] = __gcd(i, j);
	cin >> T;
	while(T --) solve();
}

附maker:

#include <bits/stdc++.h>
using namespace std;
int T = 10, n = 10000;
int t[3];
mt19937 rnd(time(0));

namespace Random
{

const auto seed=chrono::steady_clock::now().time_since_epoch().count();
mt19937 mt_rnd(seed);

template<typename IntT>
inline enable_if_t<is_integral<IntT>::value,IntT> randi(const IntT &l,const IntT &r) //[l,r]
{ return uniform_int_distribution<IntT>(l,r)(mt_rnd); }

template<typename FloatT>
inline enable_if_t<is_floating_point<FloatT>::value,FloatT> randf(const FloatT &l,const FloatT &r) //[l,r]
{ return uniform_real_distribution<FloatT>(l,r)(mt_rnd); }

template<typename Iter,typename IntT>
inline enable_if_t<is_integral<IntT>::value> randFilli(Iter first,Iter last,IntT l,IntT r) //[first,last)
{ for(uniform_int_distribution<IntT> rng(l,r);first!=last;*(first++)=rng(mt_rnd)); }

template<typename Iter,typename FloatT>
inline enable_if_t<is_floating_point<FloatT>::value> randFillf(Iter first,Iter last,FloatT l,FloatT r) //[first,last)
{ for(uniform_real_distribution<FloatT> rng(l,r);first!=last;*(first++)=rng(mt_rnd)); }

template<typename FloatT,typename ResT=bool>
inline const ResT &probability(FloatT p,const ResT &a=true,const ResT &b=false)
{ return bernoulli_distribution(p)(mt_rnd)?a:b; }

template<typename Iter>
inline Iter choose(Iter first,Iter last) //[first,last)
{ return first+mt_rnd()%distance(first,last); }

template<typename Iter>
inline void shuffle(Iter first,Iter last) //[first,last)
{ for(;first!=last;++first)swap(*first,*(first+mt_rnd()%distance(first,last))); }

template<typename IntT>
inline enable_if_t<is_integral<IntT>::value,pair<IntT,IntT>> subinterval(IntT l,IntT r)
{
    IntT resl=randi(l-1,r),resr=randi(l,r);
    if(resl<l) return make_pair(resr,resr);
    return minmax(resl,resr);
}

template<typename FloatT>
inline enable_if_t<is_floating_point<FloatT>::value,pair<FloatT,FloatT>> subinterval(FloatT l,FloatT r)
{
    FloatT resl=randf(l,r),resr=randf(l,r);
    return minmax(l,r);
}

template<typename InIter,typename OutIter>
inline OutIter sample(InIter first,InIter last,int n,OutIter out) //[first,last)
{
    auto m=distance(first,last);
    for((m<n&&(n=m));n;++first,m--)
        if(mt_rnd()%m<n) *out++=*first,n--;
    return out;
}

template<typename IntT,typename OutIter>
inline enable_if_t<is_integral<IntT>::value,OutIter> rangeSample(IntT l,IntT r,int n,OutIter out) //[l,r]
{
    unordered_set<IntT> s;
    IntT m=r-l+1,lim=m*0.6,x;
    for(n=min((IntT)n,m);n && m>lim;n--,m--)
    {
        while(s.find(x=randi(l,r))!=s.end());
        *out++=x,s.insert(x);
    }
    if(!n) return out;
    for(IntT i=l;i<=r;i++)
    {
        if(s.find(i)!=s.end()) continue;
        if(mt_rnd()%(m--)<n) *out++=i,n--;
    }
    return out;
}

vector<pair<int,int>> randTree(int n)
{
    vector<pair<int,int>> res;
    if(n<2) return res;
    vector<int> prf(n-2),deg(n+1,1);
    int p=0,u;
    randFilli(prf.begin(),prf.end(),1,n);
    for(auto &i: prf) deg[i]++;
    while(deg[u=++p]!=1);
    for(auto &v: prf)
    {
        res.emplace_back(u,v);
        if((--deg[v])==1 && v<p) u=v;
        else while(deg[u=++p]!=1);
    }
    res.emplace_back(n,u);
    return res;
}

vector<pair<int,int>> randTree(int n,int span)
{
    vector<pair<int,int>> res;
    if(n<2) return res;
    vector<int> fa(n+1),p(n);
    iota(p.begin(),p.end(),1),shuffle(p.begin(),p.end());
    for(int i=2;i<=n;i++)
    {
        int FloatT=abs(span),x;
        if(span>0) for(x=0;FloatT--;x=max(x,randi(1,i-1)));
        else if(span<0) for(x=n+1;FloatT--;x=min(x,randi(1,i-1)));
        else x=randi(1,i-1);
        fa[i]=x;
    }
    for(int i=2;i<=n;i++) res.emplace_back(p[i-1],p[fa[i]-1]);
    shuffle(res.begin(),res.end());
    return res;
}

} // namespace Random

int main() {
	freopen("1.in", "w", stdout);
	cout << T << '\n';
	for(int i = 1;i <= T;i++) {
		cout << n << " ";
		cout << rnd() % (n + 1) << "\n";
		int g = rnd() % 100 + 1;
		for(int j = 1;j <= n;j++) cout << (rnd() % (1000 / g) + 1) * g << ' ';
		cout << '\n';
		auto q = Random::randTree(n);
		for (auto p : q) {
			cout << p.first << ' ' << p.second << '\n';
		}
	}
}
2024/1/18 07:45
加载中...