← 全部文章

Hello 2020 题解

本文目录(7 节)
  1. New Year and Naming
  2. New Year and Ascent Sequence
  3. New Year and Permutation
  4. New Year and Conference
  5. New Year and Castle Construction
  6. New Year and Social Network
  7. Seollal

Hello 2020

New Year and Naming

模拟。

const int N = 23;
int n, m;
string s[N], t[N];

int main() {
	cin >> n >> m;
	for (int i = 0; i < n; i++) cin >> s[i];
	for (int i = 0; i < m; i++) cin >> t[i];
	int q;
	cin >> q;
	while (q--) {
		int x;
		cin >> x;
		--x;
		cout << s[x%n] << t[x%m] << endl;
	}
	return 0;
}

New Year and Ascent Sequence

组合计数,前缀和。

const int N = 1e5 + 7, M = 1e6 + 7;
int n, c[M], d[M], cnt;
vi e[N];
bool ok[N];

int main() {
	rd(n);
	for (int i = 1; i <= n; i++) {
		int m;
		rd(m);
		while (m--) {
			int x;
			rd(x);
			e[i].pb(x);
		}
		for (ui j = 1; j < e[i].size(); j++)
			if (e[i][j-1] < e[i][j]) ok[i] = 1;
	}
	for (int i = 1; i <= n; i++)
		if (ok[i]) ++cnt;
		else {
			c[e[i][0]]++, d[e[i].back()]++;
		}
	for (int i = M - 2; ~i; i--) c[i] += c[i+1];
	ll ans = 1ll * n * n - 1ll * (n - cnt) * (n - cnt);
	for (int i = 0; i < M - 1; i++) {
		ans += 1ll * d[i] * c[i+1];
	}
	print(ans);
	return 0;
}

New Year and Permutation

组合计数。

const int N = 2.5e5 + 7;
int n;
modint p[N], ans;

int main() {
	rd(n), rd(P);
	p[0] = 1;
	for (int i = 1; i <= n; i++) p[i] = p[i-1] * i;
	for (int i = 1; i <= n; i++) ans += p[i] * p[n+1-i] * i;
	print(ans);
	return 0;
}

New Year and Conference

以某一维为时间轴,我们需要判定在这一维上有交的在另一维上是否有交。

那么扫过这一维的所有时间点,用 multiset 实时维护包含这个时间点的所有区间即可。

总时间复杂度 O(nlog⁡n)\mathcal O(n \log n)。

const int N = 1e5 + 7;
int n, m, sa[N], ea[N], sb[N], eb[N], a[N*4];
vi l[N*4], r[N*4];

inline bool solve() {
	for (int i = 1; i <= m; ++i) l[i].clear(), r[i].clear();
	for (int i = 1; i <= n; ++i) l[sa[i]].pb(i), r[ea[i]].pb(i);
	multiset <int, greater <int> > lmax;
	multiset <int> rmin;
	for (int i = 1; i <= m; ++i) {
		for (int id : l[i]) lmax.insert(sb[id]), rmin.insert(eb[id]);
		if (lmax.size() && *lmax.begin() > *rmin.begin()) return 1;
		for (int id : r[i]) lmax.erase(lmax.find(sb[id])), rmin.erase(rmin.find(eb[id]));
	}
	return 0;
}

int main() {
	rd(n);
	for (int i = 1; i <= n; i++) rd(sa[i]), rd(ea[i]), rd(sb[i]), rd(eb[i]);
	copy(sa + 1, sa + n + 1, a + 1);
	copy(ea + 1, ea + n + 1, a + n + 1);
	copy(sb + 1, sb + n + 1, a + n * 2 + 1);
	copy(eb + 1, eb + n + 1, a + n * 3 + 1);
	sort(a + 1, a + n * 4 + 1);
	m = unique(a + 1, a + n * 4 + 1) - a - 1;
	for (int i = 1; i <= n; ++i)
		sa[i] = lower_bound(a + 1, a + m + 1, sa[i]) - a,
		ea[i] = lower_bound(a + 1, a + m + 1, ea[i]) - a,
		sb[i] = lower_bound(a + 1, a + m + 1, sb[i]) - a,
		eb[i] = lower_bound(a + 1, a + m + 1, eb[i]) - a;
	bool ans = solve();
	swap(sa, sb), swap(ea, eb);
	puts((ans | solve()) ? "NO" : "YES");
	return 0;
}

New Year and Castle Construction

以每个点为原点做一次 P2992 [USACO10OPEN]三角形计数Triangle Counting,最后将答案 ×n−42\times \frac {n - 4}2 即可。

const int N = 2.5e3 + 7;
int n;
P a[N];

inline int f(P o) {
	int x = o.x, y = o.y;
	if (x <= 0 && y < 0) return 0;
	if (x > 0 && y <= 0) return 1;
	if (x >= 0 && y > 0) return 2;
	return 3;
}

inline bool cmpa(P x, P y) { return f(x) == f(y) ? x % y > 0 : f(x) < f(y); }

inline ll solve(int o) {
	if (n <= 3) return 0;
	ll ans = 1ll * (n - 1) * (n - 2) * (n - 3) / 6;
	vector <P> p;
	for (int i = 1; i <= n; i++)
		if (i != o) p.pb(a[i] - a[o]);
	sort(p.begin(), p.end(), cmpa);
	int w = p.size();
	for (int i = 0; i < w; i++) p.pb(p[i]);
	for (int i = 0, j = 1; i < w; i++) {
		if (j == i) j = i + 1;
		while (j < 2 * w && j != i + w && p[i] % p[j] > 0) ++j;
		int w = j - i - 1;
		ans -= 1ll * w * (w - 1) / 2;
	}
	return ans;
}

int main() {
	scanf("%d", &n);
	for (int i = 1; i <= n; i++) scanf("%lf %lf", &a[i].x, &a[i].y);
	ll ans = 0;
	for (int i = 1; i <= n; i++) ans += solve(i);
	print(ans * (n - 4) / 2);
	return 0;
}

New Year and Social Network

题目太神仙了,先咕咕咕着。

Seollal

题目太神仙了,先咕咕咕着。

标签:前缀和/差分、组合计数、计算几何

评论

    填写昵称即可留言。评论经站主审核后公开,请勿提交私人信息。

    正在连接评论服务…