2020牛客暑期多校训练营(第二场)

2020牛客暑期多校训练营(第二场)(2020.7.13)

开始堇业,把之前欠的债补上。

C、Cover the Tree

这题啊,这题我在第四层,题目在第五层。

最大数目一定是定的,就是叶子节点个数加一除二。麻烦的是构造。

当时比赛的时候是想dfs序,然后首尾相连跑,哇到家都不认识。

结果一看题解,是按中点左右对称跑…

很烦。暂时先把标程挂着。

#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
#define N 200000 + 5

int n, m, rt, cnt, Deg[N], Leaf[N];
vector<int> Vec[N];

void dfs(int z, int fa)
{
	if (Deg[z] == 1)
		Leaf[++ cnt] = z;
	for (int d : Vec[z])
		if (d != fa)
			dfs(d, z);
}

int main()
{
	scanf("%d", &n);
	for (int i = 1, u, v; i < n; i ++)
	{
		scanf("%d%d", &u, &v);
		Vec[u].push_back(v);
		Vec[v].push_back(u);
		Deg[u] ++, Deg[v] ++;
	}
	for (int i = 1; !rt && i <= n; i ++)
		if (Deg[i] > 1)
			rt = i;
	dfs(rt, 0);
	m = (cnt + 1) / 2;
	printf("%d\n", m);
	for (int i = 1; i * 2 <= cnt; i ++)
		printf("%d %d\n", Leaf[i + m], Leaf[i]);
	if (cnt & 1)
		printf("%d %d\n", rt, Leaf[m]);
	return 0;
}

D、Duration

暴力模拟即可。代码:浩大师

#include<iostream>
#include<cmath>
#define ll long long 
using namespace std;

char a[20],b[20];
int main()
{
	long long x,y,z,i,j,k,sum=0;
	cin>>a;
	cin>>b;
	x=a[0]*10+a[1];
	y=a[3]*10+a[4];
	z=a[6]*10+a[7];
	i=b[0]*10+b[1];
	j=b[3]*10+b[4];
	k=b[6]*10+b[7];
	sum=abs(x*3600+y*60+z-i*3600-j*60-k);
	cout<<sum<<endl;
}

F、Fake Maxpooling

现在看来是个很脑瘫的题,不知道为什么当时一直写不出来。

就是横着滑一下,把每一行当前位置的最大值下标记录下来,再竖着滑一下。

题解说 O ( n m l o g n ) O(nmlogn) O(nmlogn)过不了,但实测能过。

单调队列确实难写,很容易写错。de了一小时bug。

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN = 5e3 + 10;
int A[MAXN][MAXN];
int main()
{
    int n, m, k; cin >> n >> m >> k;
    for (int i = 1; i <= n; ++i)
        for (int j = 1; j <= m; ++j)
            A[i][j] = i / __gcd(i, j) * j;
    vector <int> temp[MAXN];
    int que[MAXN], idx = 0;
    for (int i = 1; i <= n; ++i)
    {
        int l = 1, r = 0; idx = 0;
        for (int j = 1; j <= m; ++j)
        {
            while (l <= r && A[i][j] >= A[i][que[r]]) --r;
            while (l <= r && que[l] <= j - k) ++l;
            que[++r] = j;
            if (j >= k) temp[++idx].push_back(que[l]);
        }
    }
    ll ans = 0;
    for (int i = 1; i <= idx; ++i)
    {
        int l = 1, r = 0;
        for (int j = 0; j < temp[i].size(); ++j)
        {
            while (l <= r && A[j + 1][temp[i][j]] >= A[que[r] + 1][temp[i][que[r]]]) --r;
            while (l <= r && que[l] <= j - k) ++l;
            que[++r] = j;
            if (j >= k - 1) ans += A[que[l] + 1][temp[i][que[l]]];
        }
    }
    cout << ans << endl;
    return 0;
}

赛后总结:

计算几何太差了!!!

数据结构太差了!!!

思维太差了!!!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值