2019 ICPC Asia-East Continent Final(A,M)题解

A.

题意就是输入n,m,代表行含n格,列含m格,让我们在这个网格里面找线段,要求线段中点是交叉点;求有几个线段。

题解;

我们可以分析知道,把每一行每一列的含有合法的线段找出来,然后找出类似2*2,4*4的正方形的所有个数*2;

全部加起来就是答案。

#include <bits/stdc++.h>
using namespace std;
long long sum = 0, sum1 = 0, sum2 = 0;

int main() {
	int n, m;
	cin >> n >> m;
	for (int i = 2; i <= n; i += 2) {
		sum += n + 1 - i;
	}
	for (int i = 2; i <= m; i += 2) {
		sum1 += m + 1 - i;
	}
	sum2 += sum * (m + 1) + sum1 * (n + 1);
	for (int i = 1; i <= n; i++) {
		sum2 += sum1 * (i / 2) * 2;
	}
	cout << sum2 << endl;
}

M.

题意就是给出a排列,b排列,我们的结果序列可以加ai,但是如果i>2,j>2;i^k=j,我们的结果就要减bj,求结果最大化。

我们可以用2,3,5……的的K次方来搞在每一个里面找到最大的数,然后加起来。

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e6 + 7;

long long a[maxn], b[maxn], vis[maxn] = {0}, c[maxn], d[maxn];

int pd(int x, int  y) {
	for (ll i = x; i <= y; i *= x) {
		if (i == y) {
			return 1;
		}
	}
	return 0;
}

int main() {
	int n;
	cin >> n;
	for (int i = 1; i <= n; i++) {
		cin >> a[i];
	}
	for (int i = 1; i <= n; i++) {
		cin >> b[i];
	}
	long long sum1 = 0;
	ll maxn;
	sum1 = a[1];
	for (int i = 2; i <= n; i++) {
		long long add = 0;
		maxn = 0;
		if (!vis[i]) {
			for (ll j = i; j <= n; j *= i) {
				c[add++] = j;
				vis[j] = 1;
			}

			for (int g = 0; g < (1 << add); g++) {
				ll add1 = 0;
				long long sum = 0;
				for (int h = 0; h < add; h++) {
					if (g & (1 << h)) {
						sum += a[c[h]];
						d[add1++] = c[h];
					}
				}
				for (int i = 0; i < add1; i++) {
					for (int j = 0; j < add1; j++) {
						if (d[i] < d[j] && pd(d[i], d[j])) {
							sum -= b[d[j]];
						}
					}
				}
				maxn = max(maxn, sum);
			}
		}
		sum1 += maxn;
	}
	cout << sum1 << endl;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

算法编程张老师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值