2019 杭电多校 第六场

2019 Multi-University Training Contest 6

补题链接:2019 Multi-University Training Contest 6

1002 Nonsense Time (HDU 6635)

题意

给定包含 \(n\) 个不同数字的排列 \(p\)。一开始所有数字都冻住。再给出一个长度为 \(n\) 的数组 \(k\),\(k[i]\) 表示 \(p[k[i]]\) 在第 \(i\) 时刻解冻。输出 \(n\) 个数,表示第 \(i\) 个时刻数组 \(p\) 中解冻的数字的最长上升子序列的长度。

题解

思维 LIS

倒过来考虑 (时光倒流)。一开始所有数都是解冻的,一个一个开始冰冻。每冰冻一个数字,判断是否在当前最长上升子序列内,如果不在就输出当前最长上升子序列的长度,否则重新计算最长上升子序列。

由于给定的排列是随机的,随机排列的期望 \(LIS\) 的长度是 \(O(\sqrt{n})\),一个数在最长上升子序列内的概率为 \(1 / \sqrt{n}\),那么期望删除 \(O(\sqrt{n})\) 个数才会修改 \(LIS\)。期望时间复杂度为 \(O(n\sqrt{n}logn)\)。

1008 TDL (HDU 6641)

\(solved\ by\ zmz\)

题意

定义 \(f(n, m)\) 为第 \(m\) 小的整数 \(x\) 满足 \(x>n\) 并且 \(gcd(x,n)=1\)。给定 \(m\) 和 \(k\),求满足 \((f(n,m)-n)⊕n=k\) 的最小正整数 \(n\)。(\(⊕\) 代表按位异或)

题解

质数的密度分布

\(f(n,m)-n\) 不会超过第 \(m\) 个与 \(n\) 互质的质数,\(m\) 是比较小的

#pragma GCC optimize(2)

#include <cmath>
#include <cstdio>
#include <cstring>
#include <string>
#include <iostream>
#include <algorithm>
#include <map>
#include <iomanip>
#include <set>
#include <vector>
#include <queue>

using namespace std;
typedef long long ll;

ll gcd(ll a, ll b) {
    return b == 0 ? a : gcd(b, a % b);
}

int main() {
    ll k, m;
    int T;
    scanf("%d", &T);
    while (T--) {
//        cout << 1 << endl;
        cin >> k >> m;
        ll left = k - 1000;
        if (left < 0)left = 1;
        ll right = k + 1000;
        int flag = 0;
        for (ll i = left; i <= right; i++) {
            ll cnt = 0, tmp = i + 1;
            while (cnt < m) {
                if (gcd(tmp, i) == 1) {
                    cnt++;
//                    cout << i << " " << tmp << endl;
                }
                tmp++;
            }
//            cout << i << endl;
//            cout << "tmp:" << tmp << endl;
            if ((k ^ i) == tmp - i - 1) {
                flag = 1;
                cout << i << endl;
                break;
            }
        }
        if (!flag)cout << -1 << endl;
    }
    return 0;
}

1012 Stay Real (HDU 6645)

题意

给定一个小根堆,两个人每次从叶子节点取出一个数累加到自身的分数,堆为空时游戏结束,两个人选择最优策略。求两个人最终的分数。

题解

贪心 排序

两个人每次取最大的值,因此直接排序后间隔着累加就行,也可以使用优先队列。时间复杂度 \(O(nlogn)\)。

#include <bits/stdc++.h>
using namespace std;

const int maxn = 1e5 + 10;
typedef long long ll;

ll a[maxn];

int main() {
    int T;
    scanf("%d", &T);
    while(T--) {
        int n;
        scanf("%d", &n);
        for(int i = 0; i < n; ++i) {
            scanf("%lld", &a[i]);
        }
        sort(a, a + n);
        ll s1 = 0, s2 = 0;
        for(int i = n - 1; i >= 0; --i) {
            if((n - i) % 2) s1 += a[i];
            else s2 += a[i];
        }
        printf("%lld %lld\n", s1, s2);
    }
    return 0;
}

原文地址:https://www.cnblogs.com/wulitaotao/p/11428329.html

时间: 2024-11-05 13:27:55

2019 杭电多校 第六场的相关文章

2019杭电多校第六场hdu6638 Snowy Smile(线段树+枚举)

Snowy Smile 题目传送门 解题思路 先把y离散化,然后把点按照x的大小进行排序,我们枚举每一种x作为上边界,然后再枚举其对应的每一种下边界.按照这种顺序插入点,这是一个压维的操作,即在线段树中的y位置加上其w,并利用线段树来更新动态的最大子段和. 代码如下 #include <bits/stdc++.h> #define INF 0x3f3f3f3f using namespace std; typedef long long ll; const int N = 2005; stru

[2019杭电多校第六场][hdu6635]Nonsense Time

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6635 题意是说一开始所有数都冻结,第i秒会解冻第ki个数,求每秒状态下的最长上上升子序列长度. 这种题一想添加操作就不好实现,所以干脆反着来,想删除操作. 从第n秒开始往前遍历,每次都会冻结一个数,这时判断一下这个数是否一定要在最长上升子序列里. 使用二分的方法求最长上升子序列,并且每次求完子序列后可以处理出那些位置是必须在最长上升子序列里的. 1 #include<iostream> 2 #in

2019 杭电多校 第五场

2019 Multi-University Training Contest 5 补题链接:2019 Multi-University Training Contest 5 罚时爆炸 自闭场 1004 equation (HDU 6627) 题意: 给定一个整数 \(C\) 和 \(N\) 组 \(a_i,b_i\),求 \(∑_{i=1}^N|a_i\cdot x + b_i| = C\) 的所有解,如果有无穷多个解就输出 -1. 思路 分类讨论 分类讨论去绝对值.根据 \(b_i / a_i

2019 杭电多校 第八场

2019 Multi-University Training Contest 8 补题链接:2019 Multi-University Training Contest 8 1003 Acesrc and Good Numbers HDU 6659 题意 定义 \(f(d, n)\) 为十进制下 \(1\) 到 \(n\) 所有数的数位中数字 \(d\) 出现的次数.给定 \(x\),找出最大的 \(n(n \le x)\) 满足 \(f(d, n) = n\). 题解 看到了一个神仙做法. 显

2019 杭电多校 第七场

2019 Multi-University Training Contest 7 补题链接:2019 Multi-University Training Contest 7 1001 A + B = C 题意: 给出 \(a, b, c\),求 \(x, y, z\) 满足 \(a\cdot 10^x + b\cdot 10^y = c\cdot 10^z\).\(a, b, c \le 10^{100000}\). 题解: 补零到 \(a, b, c\) 长度相等之后,可能的情况只有四种: \

2019 杭电多校 第四场

2019 Multi-University Training Contest 4 补题链接:2019 Multi-University Training Contest 4 1001 AND Minimum Spanning Tree (HDU 6614) 题意 给定一个有 \(N\) 个结点的完全图,编号从 \(1\) 到 \(N\).结点 \(x\) 与结点 \(y\) \((1\leq x, y\leq N, x \neq y)\) 的边的权值为 \(x\) 与 \(y\) 按位与的值,求

2019 杭电多校 第三场

2019 Multi-University Training Contest 3 补题链接:2019 Multi-University Training Contest 3 1002 Blow up the city (HDU-6604) 题意 给定 \(n\) 个点和 \(m\) 条边的有向无环图,给出 \(q\) 次询问,每个询问给出 \(a\) 和 \(b\),求有多少个点,满足该点删去后 \(a\) 和 \(b\) 中至少一个点不能到达出度为 \(0\) 的点. 题解 支配树/灭绝树 拓

2019杭电多校第三场 1004 Distribution of books

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6606 考虑二分答案,我们二分一个值\(x\),那么要怎么来验证这个答案是否可行,考虑dp求解,设\(dp[i]\)为前i个在答案为\(x\)的情况下划分最最多组数,那么若\(dp[n] \geq k\) 则这个x可行, 很显然可以看出\(x\)是单调的,所以二分. \[dp[i] = max(dp[j]) + 1 (sum[i] - sum[j-1] \leq x)\] 如果直接采用暴力枚举的话复杂

2019杭电多校第四场hdu6621 K-th Closest Distance(二分答案+主席树)

K-th Closest Distance 题目传送门 解题思路 二分答案+主席树 先建主席树,然后二分答案mid,在l和r的区间内查询[p-mid, p+mid]的范围内的数的个数,如果大于k则说明这个范围内存在第k小的数,r=mid,否则不存在,l=mid+1. 代码如下 #include <bits/stdc++.h> #define INF 0x3f3f3f3f using namespace std; typedef long long ll; inline int read(){