SRM 603

250

取叶子节点最大值

500


可以看出A=s1+s2,B=s2+s1,满足这种的都能找到一个合适的C(s1,s2长度可以为0)

所以对于任何一个A,循环移位得到的B都满足,但是循环移位有可能是重复,和循环节有关系,找出n的因子,每个因子的算出来,重复的减去即可。


1000

如果两个数组都没有重复的元素的话,直接FFT即可

FFT是C[i+j] = sum{ A[i] * B[i] }

这题要求的是C[i+j] = sum{ min(A[i], B[i]) }

这题有重复的数据,如果枚举重复次数p,从1枚举到10,if(cnta[i]>=p) A[i]=1; else A[i]=0;

这样只有0,1,就能FFT了。

大于10的,不超过10000个,就可以10000^2暴力搞了。


#include <vector>
#include <list>
#include <map>
#include <set>
#include <deque>
#include <stack>
#include <bitset>
#include <algorithm>
#include <functional>
#include <numeric>
#include <utility>
#include <sstream>
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <ctime>
#include <cstring>

using namespace std;

class SumOfArrays {
public:
	string findbestpair(int, vector<int> , vector<int> );
};
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
typedef long long type;
struct comp {
	double x, y;
	comp(double _x = 0, double _y = 0) :
		x(_x), y(_y) {
	}
};

const int N = 1 << 18;
const double pi2 = 3.1415926535897932 * 2;
comp a[N], b[N], tmp[N];
int n, bn;
type res[N];
inline comp W(int n, bool inv) {
	double ang = inv ? -pi2 / n : pi2 / n;
	return comp(cos(ang), sin(ang));
}
int bitrev(int x) {
	int ans = 0;
	for (int i = 1; i <= bn; ++i)
		ans <<= 1, ans |= x & 1, x >>= 1;
	return ans;
}
void dft(comp *a, bool inv) {
	int step, to;
	comp w, wi, A, B;
	for (int i = 0; i < n; ++i) {
		to = bitrev(i);
		if (to > i)
			std::swap(a[to], a[i]);
	}
	for (int i = 1; i <= bn; ++i) {
		wi = W(1 << i, inv);
		w = comp(1, 0);
		step = 1 << (i - 1);
		for (int k = 0; k < step; ++k) {
			for (int j = 0; j < n; j += 1 << i) {
				int t = j | k, d = j | k | step;
				A = a[t];
				B.x = w.x * a[d].x - w.y * a[d].y;
				B.y = w.x * a[d].y + w.y * a[d].x;
				a[t].x = A.x + B.x, a[t].y = A.y + B.y;
				a[d].x = A.x - B.x, a[d].y = A.y - B.y;
			}
			comp tmp;
			tmp.x = w.x * wi.x - w.y * wi.y;
			tmp.y = w.x * wi.y + w.y * wi.x;
			w = tmp;
		}
	}
}
int mul(int n1, int *x1, int n2, int *x2) {
	n = std::max(n1, n2);
	for (bn = 0; (1 << bn) < n; ++bn)
		;
	++bn;
	n = 1 << bn;
	for (int i = 0; i < n; ++i)
		a[i] = b[i] = comp(0, 0);
	for (int i = 0; i < n1; ++i)
		a[i] = comp(x1[i], 0);
	for (int i = 0; i < n2; ++i)
		b[i] = comp(x2[i], 0);
	dft(a, false);
	dft(b, false);
	for (int i = 0; i < n; ++i) {
		tmp[i].x = a[i].x * b[i].x - a[i].y * b[i].y;
		tmp[i].y = a[i].x * b[i].y + a[i].y * b[i].x;
	}
	dft(tmp, true);
	for (int i = 0; i < n; ++i)
		res[i] = (type) (tmp[i].x / n + 0.1);
	for (--n; n && !res[n]; --n)
		;
	return n + 1;
}

int A[100005], B[100005];
int nn;
void getdata(int A[], int a0, int a1, int a2, int a3, int a4, int a5) {
	A[0] = a0;
	A[1] = a1;
	for (int i = 2; i < nn; ++i)
		A[i] = ((long long) A[i - 1] * (long long) a2 + (long long) A[i - 2]
				* (long long) a3 + (long long) a4) % (long long) a5;

}
int aa[200005], bb[200005], ca[200005], cb[200005];
long long ans[12][N];
long long hahaha[N];
vector<pair<int, long long> > va, vb;
string SumOfArrays::findbestpair(int NN, vector<int> Aseed, vector<int> Bseed) {
	int i, j, k, p;
	nn = NN;
	getdata(A, Aseed[0], Aseed[1], Aseed[2], Aseed[3], Aseed[4], Aseed[5]);
	getdata(B, Bseed[0], Bseed[1], Bseed[2], Bseed[3], Bseed[4], Bseed[5]);
	memset(ca, 0, sizeof(ca));
	memset(cb, 0, sizeof(cb));
	for (i = 0; i < nn; ++i) {
		ca[A[i]]++;
		cb[B[i]]++;
	}
	memset(ans, 0, sizeof(ans));
	for (p = 1; p <= 10; ++p) {
		memset(aa, 0, sizeof(aa));
		memset(bb, 0, sizeof(bb));
		for (i = 0; i < (1 << 17); ++i) {
			if (ca[i] >= p)
				aa[i] = 1;
			if (cb[i] >= p)
				bb[i] = 1;
		}
		mul(1 << 17, aa, 1 << 17, bb);
		for (i = 0; i < N; ++i)
			ans[p][i] = res[i];
	}
	for (p = 1; p < 10; ++p) {
		for (i = 0; i < N; ++i)
			ans[p][i] -= ans[p + 1][i];
	}
	p = 11;
	va.clear();
	vb.clear();
	for (i = 0; i < 100000; ++i) {
		if (ca[i] > 10)
			va.push_back(make_pair(i, ca[i]));
		if (cb[i] > 10)
			vb.push_back(make_pair(i, cb[i]));
	}
	memset(hahaha, 0, sizeof(hahaha));
	for (i = 0; i < va.size(); ++i) {
		for (j = 0; j < vb.size(); ++j) {
			if (va[i].second >= vb[j].second) {
				hahaha[va[i].first + vb[j].first] += vb[j].second;
				ans[10][va[i].first + vb[j].first]--;
			} else {
				hahaha[va[i].first + vb[j].first] += va[i].second;
				ans[10][va[i].first + vb[j].first]--;
			}
		}
	}
	for (p = 1; p <= 10; ++p) {
		for (i = 0; i < N; ++i) {
			hahaha[i] += ans[p][i] * p;
		}
	}
	int best = 0;
	for (i = 0; i < N; ++i) {
		if (hahaha[i] >= hahaha[best])
			best = i;
	}
	char ret[100];
	sprintf(ret, "%lld %d", hahaha[best], best);
	return ret;
}


### 什么是供应商关系管理系统(SRM) 供应商关系管理系统(Supplier Relationship Management, SRM)是一种旨在帮助企业优化其与供应商之间合作关系的信息技术工具。它通过集成化的流程管理和数据分析能力,提升企业在采购、供应链协作以及资源分配方面的效率和透明度[^1]。 #### SRM 的产生背景 随着全球化进程加快,企业面临的市场竞争日益激烈,传统的采购管理模式已无法满足现代商业环境的需求。为了降低采购成本并提高供应链灵活性,SRM 应运而生。该系统的引入不仅能够改善企业内部运作机制,还促进了外部合作伙伴之间的高效沟通与合作。 #### SRM 的核心功能 SRM 系统通常具备以下几类主要功能: - **供应商全生命周期管理**:覆盖从潜在供应商评估到正式签约再到绩效考核的全过程。 - **采购流程自动化**:支持在线询价、报价处理、合同签订等功能,减少人工干预带来的错误风险。 - **数据共享与协同工作**:与其他业务系统(如ERP、WMS等)无缝对接,实现跨部门甚至跨国界的数据交换和服务调用[^2]。 - **分析决策支持**:利用大数据技术和人工智能算法挖掘隐藏价值,辅助管理层制定科学合理的策略方向[^3]。 #### SRM 对企业的战略意义 实施有效的SRM方案可以帮助公司获得多方面收益,包括但不限于削减开支、缩短交货周期、改进产品质量等方面的表现;同时也有助于构建长期稳定可信赖的合作网络,在不确定因素增多的情况下保持竞争优势地位[^4]。 ```python class SupplierRelationshipManagementSystem: def __init__(self): self.modules = ["Supplier Lifecycle", "Procurement Automation", "Data Collaboration"] def manage_suppliers(self): print("Managing suppliers through lifecycle stages.") def automate_procurements(self): print("Automating procurement processes with digital tools.") def collaborate_data(self): print("Facilitating data collaboration across systems.") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值