ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

叫高二上一调?简要题解 (ACD)

2022-06-27 21:01:29  阅读:191  来源: 互联网

标签:return 高二上 ACD int 题解 ll vl vr odd


A. 电压机制

题意转换为所有奇环的并排除掉所有偶环留下的边的个数 .

建出 DFS 树,然后只有返祖边可能构成环 .

于是类似树上差分,\(odd_u\) 统计奇环,\(even_u\) 统计偶环 .

如果一条返祖边 \(u\leftrightarrow v\) 形成奇环,则 \(odd_u\) 自增 \(1\),\(odd_v\) 自减 \(1\),偶环类似 .

于是 \(u\) 的子树 \(odd\) 和即为 DFS 树上 \(u\) 与其父节点连接的边被多少奇环包含 .

于是就可以随便统计答案了,时间复杂度 \(O(n+m)\) .

using namespace std;
const int N = 1e5 + 233;
typedef pair<int, int> pii;
typedef long long ll;
vector<pii> g[N];
inline void addedge(int u, int v, int w){g[u].emplace_back(make_pair(v, w));}
inline void ade(int u, int v, int w){addedge(u, v, w); addedge(v, u, w);}
int n, m, col[N], odd[N], od[N], oddcycle;
bool vis[N];
inline void dfs(int u)
{
	for (pii _ : g[u])
	{
		int v = _.first, id = _.second; 
		if (vis[id]) continue;
		vis[id] = true;
		if (col[v])
		{
			if (col[u] == col[v]){++oddcycle; ++odd[u]; --odd[v]; ++od[id];}
			else{--odd[u]; ++odd[v]; --od[id];}
		}
		else{col[v] = 3 - col[u]; dfs(v); odd[u] += odd[v]; od[id] += odd[v];}
	}
}
int main()
{
	scanf("%d%d", &n, &m);
	for (int i=1, u, v; i<=m; i++) scanf("%d%d", &u, &v), ade(u, v, i);
	col[1] = 1; dfs(1);
	int ans = 0;
	for (int i=1; i<=m; i++) ans += (od[i] == oddcycle);
	printf("%d\n", ans);
	return 0;
}

B. 括号密码

不会 .

C. 内积

AH/HNOI2017 礼物 究极弱化版?

根据排序不等式知把 \(\{a\},\{b\}\) 从小到大排答案是最大的 .

做完了 .

using namespace std;
typedef pair<int, int> pii;
typedef long long ll;
const int N = 1919810;
int n, a[N], b[N];
int main()
{
	file("nj"); 
	scanf("%d", &n);
	for (int i=1; i<=n; i++) scanf("%d", a+i);
	for (int i=1; i<=n; i++) scanf("%d", b+i);
	sort(a+1, a+1+n); sort(b+1, b+1+n);
	ll ans = 0;
	for (int i=1; i<=n; i++) ans += 1ll * a[i] * b[i];
	printf("%lld\n", ans);
	return 0;
}

D. 排列

复读题解.bmp

我们称两个位置 \((p, q)\) 为好的,当且仅当 \((p, q)\) 不为 \((1,2),(1,4), (3,4)\) 中的任意一个 .

如果排列 \(\{a\}\) 中存在两个位置 \(p,q\) 使得 \((p,q),(a_p,a_q)\) 均为好二元组,则显然剩下的两个数在位置上和值域上都不连续,于是它俩的选择就独立了 .

于是问题变成了快速求位置在 \([l_1, r_1]\) 且值在 \([l_2, r_2]\) 中的数,二维前缀和即可 .

可以发现除了特殊排列 2413 和 3142,都是可以找到一组 \(p,q\) 的 .

这两种其实是本质相同的(reverse 一下就得到另一个了),所以下面以 2413 为例说明 .

考虑枚举 3,4 的位置,那么问题就变成在某位前面找一个数,后面找一个数,要求前面比后面大的方案数,直接前缀和即可 .

时间复杂度 \(O(n^2)\) .

using namespace std;
const int N = 2e3 + 233;
typedef pair<int, int> pii;
typedef long long ll;
int n;
ll a[15], b[N], s[N][N];
ll sum(int i, int vl, int vr){return s[i][vr] - s[i][vl - 1];}
ll S(int l, int r, int p, int q, int vl, int vr)
{
	if (p) return sum(r, 1, vl-1) - sum(l-1, 1, vl-1);
	if (q) return sum(r, vr+1, n) - sum(l-1, vr+1, n);
	return sum(r, vl+1, vr-1) - sum(l-1, vl+1, vr-1);
}
ll solve(int p, int q, int r, int s)
{
	ll ans = 0; int L = min(a[p], a[q]), R = max(a[p], a[q]);
	for (int i=1; i<=n; i++)
		for (int j=i+1; j<=n; j++)
			if ((b[i] < b[j]) == (a[p] < a[q]))
			{
				int vl = min(b[i], b[j]), vr = max(b[i], b[j]);
				ans += ((r == 1) ? S(1, i-1, a[r]<L, a[r]>R, vl, vr) : S(i+1, j-1, a[r]<L, a[r]>R, vl, vr)) * 
				       ((s == 4) ? S(j+1, n, a[s]<L, a[s]>R, vl, vr) : S(i+1, j-1, a[s]<L, a[s]>R, vl, vr));
			}
	return ans;
}
int main()
{
	file("d");
	scanf("%d%lld%lld%lld%lld", &n, a+1, a+2, a+3, a+4);
	for (int i=1; i<=n; i++) scanf("%lld", b+i);
	for (int i=1; i<=n; i++)
		for (int j=1; j<=n; j++) s[i][j] = s[i-1][j] + (b[i] <= j);
	auto check = [=](int x, int y, int l, int r) -> bool
	{
		if (l > r) swap(l, r);
		return ((a[x]>l) != (a[y]>l)) || ((a[x]>r) != (a[y]>r));
	};
	if (check(1, 4, a[2], a[3])){printf("%lld\n", solve(2, 3, 1, 4)); return 0;}
	if (check(2, 4, a[1], a[3])){printf("%lld\n", solve(1, 3, 2, 4)); return 0;}
	if (check(1, 3, a[2], a[4])){printf("%lld\n", solve(2, 4, 1, 3)); return 0;}
	if (a[1] == 3) // 3142
	{
		reverse(a+1, a+5); reverse(b+1, b+1+n);
		for (int i=1; i<=n; i++)
			for (int j=1; j<=n; j++) s[i][j] = s[i-1][j] + (b[i] <= j); // !!!!!!!!!
	} swap(a[3], a[4]);
	ll ans = -solve(1, 3, 2, 4);
	for (int i=1; i<=n; i++)
		for (int j=i+1; j<=n; j++)
			if (b[i] < b[j]) ans += (s[n][b[i]] - s[j][b[i]]) * (sum(n, b[i], b[j]) - sum(j, b[i], b[j]));
	printf("%lld\n", ans);
	return 0;
}

标签:return,高二上,ACD,int,题解,ll,vl,vr,odd
来源: https://www.cnblogs.com/CDOI-24374/p/16417496.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有